C++ 使成员变量对象可修改但不可赋值
我到处寻找这个问题的答案,也许我只是没有使用正确的术语来得到任何结果 有没有办法使一个成员变量是常量,因为它不能被重新分配,并且始终是同一个对象,但仍然允许修改对象本身?很像指向非常量对象的常量指针的行为,但不是实际指针C++ 使成员变量对象可修改但不可赋值,c++,C++,我到处寻找这个问题的答案,也许我只是没有使用正确的术语来得到任何结果 有没有办法使一个成员变量是常量,因为它不能被重新分配,并且始终是同一个对象,但仍然允许修改对象本身?很像指向非常量对象的常量指针的行为,但不是实际指针 我看到的主要用例是合成。假设Foo有一个条,您希望能够访问和修改该条,但不希望更改Foo拥有的条。只需更改该条上的属性/调用非常量方法。有什么方法可以做到这一点吗?不要使用const机器;它太原始了(它只是一个位:要么“改变”要么“不改变”) 但是,您可以将分配标记为私有,将容
我看到的主要用例是合成。假设Foo有一个条,您希望能够访问和修改该条,但不希望更改Foo拥有的条。只需更改该条上的属性/调用非常量方法。有什么方法可以做到这一点吗?不要使用
const
机器;它太原始了(它只是一个位:要么“改变”要么“不改变”)
但是,您可以将分配标记为私有,将容器标记为友元,以便只允许容器方法分配,但可以将变体标记为公共,以便其他人使用
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)
}
我的最佳猜测是,您可以将成员设置为私有,然后使用setter成员函数来实现所需的机制(即,最终用户只能按照您希望的方式修改成员变量)。通常您只需这样做即可
struct Foo {
Bar bar;
};
然后,每个Foo
对象都有一个Bar
子对象,该子对象包含在Foo
本身中,其地址不变。分配给bar
调用bar
的赋值操作符;它不会更改栏的位置
如果您需要栏中的多态行为,您可以这样做
struct Foo {
const std::unique_ptr<Bar> bar;
};
structfoo{
const std::唯一的ptr条;
};
这里,由于std::unique\u ptr
是const
,因此在Foo
初始化之后,无法使其指向不同的Bar
对象,但由于Bar
本身不是const
,因此可以对其进行修改。您也可以使用const std::shared_ptr
也许我不明白,但我不确定这是否与问题有关。问题是关于不可分配的成员,而不是关于const location成员。在任何情况下,您的问题的前半部分都不是必需的,只有将酒吧分配给另一个酒吧不会改变它的地址。@ShmuelH。问题是,“……不改变哪一个bar Foo。”重新分配对象时,对象仍然是同一个对象。我假设OP误解C++对象模型。对,这个问题有点混乱。也许他是想说赋值就像改变一个对象。问题是“很像一个常量指针指向一个非常量对象的行为,但不是一个实际的指针?”这个答案使用了一个实际的指针。如果这个问题是一个混淆,我很抱歉。不好的措辞和我C++的新组合。扩展:甚至可以编写一个包装器,它可以自动地为任何对象做这样的操作:<代码> NoTyApabsiple MyType;<代码>这个,再加上@Shmuel H.的包装建议,正是我想要的!非常感谢。然而,在这些情况下,更好的做法是使用Foo的getter以允许在需要时进行更多的控制,还是仅仅公开Foo,除非您确定确实需要额外的控制?@Azk a bynon-const reference
getter也可以赋值。使用getter返回not_assignable的新实例。