我可以为const和非const实例编写不同的copyCtor吗?

X''*_*X'' 7 c++ deep-copy copy-constructor shallow-copy

我有以下问题:

我有一个应该这样做的课:

Obj o;
Obj o1(o), o1=o; // deep-copies
const Obj c(o), c=o; // deep-copies
const Obj c1(c), c1=c; // shallow-copies
Obj o2(c), o2=c; // deep-copies
Run Code Online (Sandbox Code Playgroud)

如果没有继承,我怎么能这样做呢?(我的意思是我会Const_objObj其他方面继承.)

编辑:

o.clone()直接使用不是一个选项,因为我可以轻易地通过意外克隆来引入错误.

编辑:

最后,使用Scott Meyers的Effective C++的想法,有一个适当的,完整的解决方案和惰性评估.看看我的答案如下.

X''*_*X'' 2

在阅读Scott Meyers 的《Effective C++》后,以下是解决方案:

定义一个执行惰性求值的模板(带有引用计数):

class Obj : private lazy<Obj_data>{};
Run Code Online (Sandbox Code Playgroud)

惰性存储 Obj_data 私有,具有受保护的访问器,一个用于修改,一个用于只读访问。
如果需要,修饰符访问器首先深复制Obj_data,然后移交对数据的引用。只读访问器仅返回 const 引用。

这样做的总体成本是存储 2 个额外的指针(一个用于数据,一个用于计数器)和一个计数器。

实现是这样的:

class lazy{
protected:
  lazy(const lazy&obj){lazy_copy(obj);}
  //(the required constructors, operator= ...)

  // accessors:
  const Obj_data& data() const {return *od;}
  Obj_data& mod_data() {make_private(); return *od;}
private:
  void lazy_copy(const lazy& obj);
  void make_private(); // this does the actual deep-copy, as late as possible.
private:
  counter*;
  Obj_data* od;
};
Run Code Online (Sandbox Code Playgroud)

Obj因此,读取和修改go的属性

void Obj::method(){
   cout << data().some_attribute;    // simple read
   mod_data().i = 10;                // simple modify
   const Obj_data& const_d = data(); // assignable for lots of read-outs
   Obj_data& var_d = mod_data();     // assignable for lots of modifications.
}
Run Code Online (Sandbox Code Playgroud)

请注意,您只能data()const成员中使用,就像mod_data()类中的非常量函数一样,因此此解决方案完全安全,开销很小。

理论背景:问题中期望的行为是一个实现细节,与客户端无关。因此我们通过私有继承来解决。