我正在开发一个不那么小的类(它经常更改),我不需要提供公共复制构造函数和复制分配。该类具有具有值语义的对象,因此默认复制和分配工作。
该类在层次结构中,具有虚拟方法,因此我提供了一个虚拟 Clone() 以避免切片并执行“多态复制”。
我不想声明复制分配和构造受保护并定义它们(并与更改保持同步),除非我有一些特殊的事情要执行。
有人知道是否还有其他方法吗?
谢谢!
UgaSoft
我正在开发一个不那么小的类(它经常更改),我不需要提供公共复制构造函数和复制分配。该类具有具有值语义的对象,因此默认复制和分配工作。
该类在层次结构中,具有虚拟方法,因此我提供了一个虚拟 Clone() 以避免切片并执行“多态复制”。
我不想声明复制分配和构造受保护并定义它们(并与更改保持同步),除非我有一些特殊的事情要执行。
有人知道是否还有其他方法吗?
谢谢!
UgaSoft
来自多态层次结构的对象,具有值语义 ? 这里不对劲。
如果您确实需要您的类具有值语义,请查看 J.Coplien 的 Envelop-Letter Idiom 或这篇关于常规对象的文章 [1]。
[1] 肖恩父。“超越物体”。了解我们编写的软件。http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations。C++ 连接。2005 年 11 月。
高温下,
我认为 C++ 语言中没有任何东西可以让你这样做。虽然我很想在这一点上是错误的。
我过去遇到过这个问题并提出了以下解决方案。假设班级是C1。
这种方法有几个缺点。也就是说,它感觉有点不自然,并且消除了直接的字段访问(可以通过小的访问器函数来缓解)。
这是一种迂回的方式来做你正在寻找的事情,但它避免了你必须手动编写复制构造函数。
也许我找到了解决方案...
我可以放入我的根基类(或者我可以创建一个小的接口类,没有数据成员,并执行多重继承)这里是空的受保护的复制构造函数。我不会在派生类中重新定义 Copy ctor,如果是默认的就可以了。现在客户端无法访问默认复制ctor(因为无法访问基础),但默认工作!
有人反对吗?
如果你可以使用 C++0x...
class A
{
protected:
A(const A&) = default;
};