【问题标题】:Copy constructor shortcut复制构造函数快捷方式
【发布时间】:2012-06-21 10:48:59
【问题描述】:

我有一个大约有 50 名成员的班级。其中1个是指针。所以,自然我必须创建自己的复制构造函数,复制所有内容并创建该对象的新实例。我的问题是:是否有一种快捷方式或某种特殊方法可以复制所有内容(就像默认的复制构造函数一样),然后只处理那个指针?而不是手动复制每个成员。

【问题讨论】:

标签: c++ copy-constructor


【解决方案1】:

我会将您的指针包装到一个帮助类中,该类以您喜欢的方式进行复制。这样您就可以使用默认的复制 ctor 离开大类。

【讨论】:

  • 有趣的是,我编写了这样一个类来毫不费力地支持 Pimpl 成语。它不一定是一个容易制作的类,但一旦完成,你可以在任何地方重复使用它:D
  • 另外,您可以将所有非指针数据放入其自己的结构中,然后复制该结构。
  • @JamesKanze 一个好的目标是让您的大部分代码免于手写析构函数、复制/移动构造函数、operators= 和析构函数。如果您将语义封装到小型通用智能指针或资源处理程序类中,那么您可以轻松地让自动生成的构造函数、析构函数和运算符来做您想做的事情——干净且一致。
  • @Kos 为什么这是一个好目标?我从来没有特别听说过它是一个目标。 (事实上​​,我见过的很多编码指南都需要显式复制和赋值,即使它们是空的。这表明您已经考虑过它们,并且允许它们不内联。)
【解决方案2】:

改为使用智能指针,然后依赖类的默认复制构造函数。

标准智能指针(unique_ptrshared_ptr)没有可以复制其对象的复制构造函数,但您可以自己汇总。

【讨论】:

  • shared_ptr 没有复制构造函数?
  • 它没有复制对象的复制构造函数(它复制内部指针并增加引用计数器)
【解决方案3】:

既然你说默认副本不起作用,我会假设你的对象拥有指针。

如果您只需要一个可以正确清理的浅拷贝,请使用 C++11 中的 shared_ptr 或 boost。

如果你需要一个深拷贝,我首先建议通过值而不是指针来存储包含的对象。然后您就可以免费获得副本,而且您不必担心额外的一组内存管理。

最后,如果这些都不是一个选项,我会编写一个指针包装器来处理深拷贝语义(我不相信 boost 提供这样的类)。

【讨论】:

  • 按值存储是实现所有权的第一选择,但它确实存在一些限制(例如将两个对象的生命周期绑定在一起,这并不总是可取的)。像值一样的智能指针在某些情况下会很有用,可能对 OP 也是有用的。奇怪的是标准库和 boost 都没有。
猜你喜欢
  • 2012-08-24
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2017-11-29
  • 2019-10-02
  • 2012-07-13
  • 2012-02-12
相关资源
最近更新 更多