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);
}
}