创建一个易于维护的复制构造函数

Rou*_*ass 12 c++ constructor deep-copy

考虑以下课程:

class A {

char *p;
int a, b, c, d;

public:
   A(const &A);
};
Run Code Online (Sandbox Code Playgroud)

请注意,我必须定义一个复制构造函数,以便执行"p"的深层复制.这有两个问题:

  1. 大多数字段应该简单地复制.逐个复制它们是丑陋且容易出错的.

  2. 更重要的是,每当向类中添加新属性时,都需要更新复制构造函数,这会产生维护噩梦.

我个人喜欢做类似的事情:

A(const A &a) : A(a)
{
   // do deep copy of p
   :::
}
Run Code Online (Sandbox Code Playgroud)

因此,首先调用默认的复制构造函数,然后执行深层复制.
不幸的是,这似乎不起作用.

有没有更好的方法来做到这一点?一个限制 - 我不能使用共享/智能指针.


Sbi的建议很有意义.我想我会创建用于处理资源的包装类.我不想使用shared_ptr,因为boost库可能并非在所有平台上都可用(至少在标准发行版中没有,OpenSolaris就是一个例子).

我仍然认为,如果你能以某种方式让编译器为你创建默认的构造函数/赋值运算符,那么你可以在它上面添加你的功能.我认为手动创建的复制构造函数/赋值运算符函数将是一个麻烦创建和维护的噩梦.因此,我个人的经验法则是不惜一切代价避免自定义复制构造函数/赋值运算符.

感谢大家的回复和有用的信息,并在我的问题中抱怨错别字.我是从手机上打字的.

sbi*_*sbi 19

根据经验:如果必须手动管理资源,请将每个资源包装到自己的对象中.

char*使用适当的复制构造函数将其放入自己的对象中,让编译器为其执行复制构造函数A.请注意,这也涉及您在问题中未提及的分配和销毁,但仍需要处理.
标准库有几种类型,从该来接,其中std::stringstd::vector<char>.

  • +1永远不要忘记三巨头:http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29 (3认同)
  • 这是要遵循的建议.每当你需要为"功能"类(而不是技术类)编写复制构造函数时,你可能做错了什么. (3认同)

fre*_*low 4

char*用。。。来代替std::string

  • 我认为 char* p 只是类中需要在复制器中进行特殊处理的任何指针的示例。 (2认同)
  • @Gene Vincent:那么OP应该在问题中这么说。在这种情况下,应该编写一个专用的 RAII 类来管理指针。 (2认同)
  • @Philipp:......或者选择一个合适的现成的。 (2认同)