我为此寻找答案的高低,或许我只是没有使用正确的条款来获得任何结果?
是否有任何方法可以使成员变量为const,因为它不能被重新分配,并且将始终是同一个对象,但仍然允许对象本身被修改?就像const指针指向非const对象的行为,但不是一个实际的指针?
我看到的主要用例是组合。让我们说Foo有一个Bar,你希望能够访问和修改那个Bar,但不能更改哪个 Bar Foo。只需更改该栏上的属性/调用非const方法即可。有没有办法做到这一点?
答案 0 :(得分:2)
不使用const
正确性机制;它太原始了(它只是一点:“改变”或“不改变”)。
然而,您可以将赋值私有和容器标记为朋友,以便只允许容器方法分配,但可以将mutator标记为public以供其他人使用。
class Foo {
public:
int x, y;
Foo() : x(0), y(0) {}
friend class Bar;
private:
Foo& operator=(const Foo& other){
...
return *this;
}
};
class Bar {
public:
Foo foo;
Bar(){
foo = Foo(); // OK from here
};
};
void baz() {
Bar bar;
bar.foo.x = 42; // Ok assigning a member of foo
bar.foo = Foo(); // Invalid from here (doesn't compile)
}
答案 1 :(得分:1)
通常你会这样做
struct Foo {
Bar bar;
};
每个Foo
对象都有一个Bar
子对象,它包含在Foo
本身,其地址不会改变。分配给bar
会调用Bar
的赋值运算符;它不会更改bar
的位置。
如果您需要Bar
的多态行为,您可以
struct Foo {
const std::unique_ptr<Bar> bar;
};
此处,由于std::unique_ptr
为const
,因此在Bar
初始化后不能指向不同的Foo
对象,但是因为{{1} }}本身不是Bar
,可以修改它。您也可以使用const
。
答案 2 :(得分:0)
我最好的猜测是你可以将成员设为私有,然后使用setter成员函数来实现你想要的机制(即最终用户只能以你希望它们被修改的方式修改你的成员变量)。