【问题标题】:const correctness and member pointersconst 正确性和成员指针
【发布时间】:2016-07-28 13:19:35
【问题描述】:

我在 Accelerate 方法上有 const,但我可以调用 power 方法。他们是一种真正阻止这种情况的方法吗?

class Engine{
public:
    void Power(){
    }
};

class Car{
public:
    Car() : p(new Engine()){}

    void Accelerator() const{
        p->Power();
    } 
    private:
        Engine* p;
};

【问题讨论】:

  • 因为您的 Engine 指针是 const 而不是它指向的东西。
  • 您是否需要Engine* 而不仅仅是Engine
  • 一辆真正的汽车会包含引擎,而不仅仅是指向一个。

标签: c++ constants const-correctness


【解决方案1】:

对于Car,const 方法是不修改Car 成员变量的方法。

所以,只要Car::Accelerator 没有使p 指向不同的位置,它就是有效的。

由于pAccelerator中没有被修改(意味着它没有指向不同的内存地址),所以程序是有效的。

当你让p指向不同的位置时,程序编译失败:

  void Accelerator() const {
        p= nullptr; //wrong
  } 

【讨论】:

    【解决方案2】:

    常量保护只影响直接成员,在这种情况下只影响指针。此对象之外的值(也称为指向值)不受保护。

    您必须决定是否将指向的价值视为您自己或其他人。

    【讨论】:

      【解决方案3】:

      您可以将成员Engine修改为const*,这将使pp指向的Engine对象Carconst

      class Engine{
       public:
        void Power(){
        }
      };
      
      class Car{
       public:
        Car() : p(new Engine()){}
      
        void Accelerator() const{
            p->Power();
        } 
       private:
        Engine const* p;
      };
      

      这将不再编译:

      test_const.cpp:12:9: error: member function 'Power' not viable: 'this' argument
            has type 'const Engine', but function is not marked const
              p->Power();
              ^
      test_const.cpp:3:10: note: 'Power' declared here
          void Power(){
               ^
      

      但这意味着Car 的任何成员都不能修改*p,这可能不是您想要的。请参阅@NathanOliver 的评论以获得更好的答案。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多