使成员变量对象可修改但不可赋值

时间:2016-10-20 21:37:01

标签: c++

我为此寻找答案的高低,或许我只是没有使用正确的条款来获得任何结果?

是否有任何方法可以使成员变量为const,因为它不能被重新分配,并且将始终是同一个对象,但仍然允许对象本身被修改?就像const指针指向非const对象的行为,但不是一个实际的指针?

我看到的主要用例是组合。让我们说Foo有一个Bar,你希望能够访问和修改那个Bar,但不能更改哪个 Bar Foo。只需更改该栏上的属性/调用非const方法即可。有没有办法做到这一点?

3 个答案:

答案 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_ptrconst,因此在Bar初始化后不能指向不同的Foo对象,但是因为{{1} }}本身不是Bar,可以修改它。您也可以使用const

答案 2 :(得分:0)

我最好的猜测是你可以将成员设为私有,然后使用setter成员函数来实现你想要的机制(即最终用户只能以你希望它们被修改的方式修改你的成员变量)。