【发布时间】:2011-03-12 16:26:54
【问题描述】:
考虑以下类:
class A {
char *p;
int a, b, c, d;
public:
A(const &A);
};
请注意,我必须定义一个复制构造函数才能对“p”进行深层复制。这有两个问题:
应该简单地复制大部分字段。一个一个地复制它们既丑陋又容易出错。
更重要的是,每当向类添加新属性时,都需要更新复制构造函数,这会带来维护的噩梦。
我个人想做这样的事情:
A(const A &a) : A(a)
{
// do deep copy of p
:::
}
所以先调用默认的拷贝构造函数,然后再进行深拷贝。
不幸的是,这似乎不起作用。
有没有更好的方法来做到这一点? 一个限制 - 我不能使用共享/智能指针。
Sbi 的建议很有道理。我想我会创建包装类来处理资源。我不想使用 shared_ptr,因为 boost 库可能并非在所有平台上都可用(至少在标准发行版中不可用,OpenSolaris 就是一个例子)。
我仍然认为,如果你能以某种方式让编译器为你创建默认的构造函数/赋值运算符,并且你可以在上面添加你的功能,那会很棒。我认为手动创建的复制构造函数/赋值运算符函数创建起来很麻烦,维护起来也是一场噩梦。所以我个人的经验法则是不惜一切代价避免自定义复制构造函数/赋值运算符。
感谢大家的回复和有用的信息,并对我的问题中的错别字表示歉意。我是用手机输入的。
【问题讨论】:
-
为什么不能使用智能指针?
-
@Neil:也许他的键盘没有下划线?
-
到目前为止,所有答案都集中在不需要自定义复制 c'tor 上。但是这里提出的问题的有趣部分是:是否可以保留一些自动生成的功能并只是扩展它(不仅限于处理指针)。
-
@Gene Vincent:是的,通过向具有自动生成的复制构造函数的类添加派生或组合关系。
-
如果你需要一个允许深度复制的智能指针,你可以检查 axter smart pointer。对我来说效果很好。否则我也会不时使用查尔斯在答案中使用的技巧。
标签: c++ constructor deep-copy