Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使成员变量对象可修改但不可赋值_C++ - Fatal编程技术网

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 by
non-const reference
getter也可以赋值。使用getter返回not_assignable的新实例。