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方法一样.进一步充实课堂留给读者练习.
如果更改的成员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)
您遇到的问题是,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。