0

我正在开发一个不那么小的类(它经常更改),我不需要提供公共复制构造函数和复制分配。该类具有具有值语义的对象,因此默认复制和分配工作。

该类在层次结构中,具有虚拟方法,因此我提供了一个虚拟 Clone() 以避免切片并执行“多态复制”。

我不想声明复制分配和构造受保护并定义它们(并与更改保持同步),除非我有一些特殊的事情要执行。

有人知道是否还有其他方法吗?

谢谢!

UgaSoft

4

4 回答 4

3

来自多态层次结构的对象,具有值语义 ? 这里不对劲。

如果您确实需要您的类具有值语义,请查看 J.Coplien 的 Envelop-Letter Idiom 或这篇关于常规对象的文章 [1]。

[1] 肖恩父。“超越物体”。了解我们编写的软件。http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations。C++ 连接。2005 年 11 月。

高温下,

于 2008-11-06T16:25:38.220 回答
0

我认为 C++ 语言中没有任何东西可以让你这样做。虽然我很想在这一点上是错误的。

我过去遇到过这个问题并提出了以下解决方案。假设班级是C1。

  1. 定义一个名为 Data 的私有内部类
  2. 把我所有我想在 C1 中删除的成员放在数据上
  3. 定义一个受保护的复制构造函数,它只在 C1 之间复制 Data 实例。

这种方法有几个缺点。也就是说,它感觉有点不自然,并且消除了直接的字段访问(可以通过小的访问器函数来缓解)。

这是一种迂回的方式来做你正在寻找的事情,但它避免了你必须手动编写复制构造函数。

于 2008-11-06T16:13:00.553 回答
0

也许我找到了解决方案...

我可以放入我的根基类(或者我可以创建一个小的接口类,没有数据成员,并执行多重继承)这里是空的受保护的复制构造函数。我不会在派生类中重新定义 Copy ctor,如果是默认的就可以了。现在客户端无法访问默认复制ctor(因为无法访问基础),但默认工作!

有人反对吗?

于 2008-11-06T16:26:10.683 回答
0

如果你可以使用 C++0x...

class A
{
    protected:
        A(const A&) = default;
};
于 2011-08-04T08:22:06.950 回答