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_obj从Obj其他方面继承.)
编辑:
o.clone()直接使用不是一个选项,因为我可以轻易地通过意外不克隆来引入错误.
编辑:
最后,使用Scott Meyers的Effective C++的想法,有一个适当的,完整的解决方案和惰性评估.看看我的答案如下.
在阅读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()类中的非常量函数一样,因此此解决方案完全安全,开销很小。
理论背景:问题中期望的行为是一个实现细节,与客户端无关。因此我们通过私有继承来解决。
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |