有一种方法可以使用默认的复制构造函数声明复制构造函数非公共AND吗?

时间:2008-11-06 16:02:54

标签: c++ constructor copy

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

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

我不想宣布复制赋值和构造受保护并定义它们(并与变化保持同步),除非我有一些特殊的事情要执行。

有人知道是否有另一种方式?

谢谢!

UgaSofT

4 个答案:

答案 0 :(得分:3)

来自多态层次结构的对象,还有值语义?这里出了点问题。

如果你真的需要你的班级有价值语义,请看看J.Coplien的Envelop-Letter Idiom,或者这篇关于Regular Objects [1]的文章。

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

HTH,

答案 1 :(得分:0)

我认为C ++语言中没有任何内容允许您这样做。虽然我喜欢在这一点上出错。

我过去遇到过这种情况并提出以下解决方案。 Asumme班级是C1。

  1. 定义名为Data
  2. 的私有内部类
  3. 把我所有的成员放在C1中,而不是数据
  4. 定义一个仅在C1之间复制数据实例的受保护的复制构造函数。
  5. 这种方法有一些缺点。即它感觉有点不自然并且消除了直接的现场访问(可以通过小的访问器功能来减轻)。

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

答案 2 :(得分:0)

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

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

有一些异议?

答案 3 :(得分:0)

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

class A
{
    protected:
        A(const A&) = default;
};