非const指针成员的C++ const方法

Ale*_*lex 5 c++ methods pointers const object

我想知道如何通过const方法保护非const指针成员免受对象的影响.例如:

class B{
    public:
        B(){
            this->val=0;
        }

        void setVal(){
            this->val = 2;
        }

    private:
        int val;
};

class A{
    public:
        A():b(new B){}
        void changeMemberFromConstMethod() const{
            this->b->setVal();
        }
    private:
        B * b; // how to protect data pointed in A::changeMemberFromConstMethod
}
Run Code Online (Sandbox Code Playgroud)

是否有可能"保护"从他的方法中指出的A :: b数据?经过对网络的多次研究,尚未发现满意的反应.

谢谢你的帮助.

Igo*_*nik 10

也许是这样的事情:

template <typename T>
class deep_const_ptr {
  T* p_;
public:
  deep_const_ptr(T* p) : p_(p);

  T* operator->() { return p_;}
  const T* operator->() const { return p_;}
};

class A {
  deep_const_ptr<B> b = new B;
};
Run Code Online (Sandbox Code Playgroud)

deep_const_ptr行为类似于const方法中的const T* const指针A,就像T*非const方法一样.进一步充实课堂留给读者练习.

  • 当然,通过超负荷重新组合.能怎样? (2认同)

R S*_*ahu 6

如果更改的成员A

    B* b;
Run Code Online (Sandbox Code Playgroud)

    B b;
Run Code Online (Sandbox Code Playgroud)

然后你会得到预期的行为.

class A{
    public:
        A() : b() {}

        void changeMemberFromConstMethod() const{
            this->b.setVal(); // This will produce a compiler error. 
        }
    private:
        B b;
}
Run Code Online (Sandbox Code Playgroud)


rwo*_*ols 5

您遇到的问题是,const方法使所有成员变量成为可能const。但是,在这种情况下,它将成为指针const。具体来说,就好像您拥有的全部一样B * const b,这意味着一个指向(仍然)可变的常量指针B。如果未将成员变量声明为const B * b,(即,指向常量的可变指针B),则没有办法防止这种行为。

如果您需要的只是一个const B,那么一定要A这样定义:

class A {
public:
    A() : b(new B) {}

    // This WILL give an error now.
    void changeMemberFromConstMethod() const { b->setVal(); }
private:
    const B* b;
}
Run Code Online (Sandbox Code Playgroud)

但是,如果使用其他Amutate 方法B,那么您所能做的就是确保B不会在您的的const方法中发生突变A