Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.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++_Constructor_Constants_Copy Constructor_Observers - Fatal编程技术网

C++ 非常量复制构造函数

C++ 非常量复制构造函数,c++,constructor,constants,copy-constructor,observers,C++,Constructor,Constants,Copy Constructor,Observers,我正在为对象进行写时复制优化(即,当调用复制构造函数时,只需保存指向对象的指针,并且仅当我们需要更改对象时,或者当我们指向要更改的对象时,才真正复制它) 在改变我们的目标之前,我们需要通知其他人,这样他们才能进行真正的应对。对于此操作,我决定使用观察者模式: struct subject { void register_observer(const event& e, observer& obs); void notify(const event& e)

我正在为对象进行写时复制优化(即,当调用复制构造函数时,只需保存指向对象的指针,并且仅当我们需要更改对象时,或者当我们指向要更改的对象时,才真正复制它)

在改变我们的目标之前,我们需要通知其他人,这样他们才能进行真正的应对。对于此操作,我决定使用观察者模式:

struct subject {
    void register_observer(const event& e, observer& obs);
    void notify(const event& e) const;

private:
    std::map<event, std::vector<observer*> > _observers;
};
然后,我们的对象继承了它们。问题是,在复制构造函数中,当我们得到const参数时,我们需要调用register_observer,这是一种非const方法:

my_class::my_class(my_class const &other) {
    if (other._copy != NULL) this->_copy = &other;
    else {
        this->_copy = other._copy;
        this->_copy->register_observer(event::CHANGED, *this);
    }
}
我发现的一个可能的解决方案是使用
可变的
,但我认为它不适合那里,因为对象在逻辑上发生了变化


还有其他想法吗?

在您的情况下,您可能应该使用
mutable
关键字


您的对象在逻辑上仍然保持常量,因为从用户的角度来看,没有任何更改。

对象在逻辑上没有更改。从用户的角度来看,对象中没有任何变化。要重新表述@Ninetainedo所说的内容,
mutable
是正确的选择。那么为什么不让复制构造函数采用非常量引用呢?@Alexandr:您仍然可以添加一个临时使用r值引用的构造函数。但是可变似乎是正确的选择。“在改变我们的对象之前,我们需要通知其他人,这样他们才能进行真正的应对”似乎是错误的——如果你有十件东西引用相同的原件,并且原件发生了变化,你就复制了十份。通常,写时复制意味着进行更改的对象进行了复制,数据本身是不可变的,您的问题的其余部分都不需要。
my_class::my_class(my_class const &other) {
    if (other._copy != NULL) this->_copy = &other;
    else {
        this->_copy = other._copy;
        this->_copy->register_observer(event::CHANGED, *this);
    }
}