2008-11-06 102 views
0

我有一个不太小的类正在开发中(它经常更改),我不需要提供公共的复制构造函数和复制指定。 该类具有值语义的对象,因此默认复制和分配工作。有一种方法来声明复制构造函数非公开和使用默认复制构造函数?

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

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

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

谢谢!

UgaSofT

+0

你很清楚。你想让默认拷贝文件可供内部使用,但只是不公开正确? – 2008-11-06 16:09:28

+0

哎呀...这应该是“你不太清楚”。 – 2008-11-06 16:10:08

回答

3

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

如果您确实需要您的类具有值语义,请查看J.Coplien的Envelop-Letter成语或本文中关于Regular Objects [1]的内容。

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

HTH,

0

我不认为这是在C++语言,允许你做这种事。尽管我很想在这一点上做错。

我在过去遇到过这种情况,想出了以下解决方案。假定班级是C1。

  1. 定义一个名为数据
  2. 私有内部类把我的会员我会在C1 delare上的数据,而不是
  3. 定义一个受保护的拷贝构造函数C1之间,仅仅拷贝数据实例。

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

这是一个迂回的做你正在寻找的方式,但它避免了你必须手工编写拷贝构造函数。

0

也许我已经找到了解决办法...

我可以把我的根基类(或者我可以创建一个小的接口类,没有数据成员,并执行多重继承)这里是空的受保护的拷贝构造函数。 我不重新定义派生类中的Copy ctor,当默认的那个没关系。现在,客户端无法访问默认拷贝ctor(导致基座无法访问),但默认工作!

有一些反对意见吗?

0

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

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