2010-03-19 57 views
1

我有一个Shape类包含潜在的许多顶点,我正在考虑使私人复制构造/复制分配,以防止意外的不必要的复制我的重量级类(例如,通过值而不是通过引用传递)。通常使重量级课程不可复制是否是良好的做法?

要制作一个Shape的副本,人们必须故意调用“克隆”或“重复”方法。

这是一个很好的做法吗?我想知道为什么STL容器不使用这种方法,因为我很少想通过它们来传递它们。

回答

7

限制您的用户并不总是一个好主意。只记录复制可能花费很多就足够了。如果用户真的想要复制,那么通过提供复制构造函数来使用C++的本地语法是一种更简洁的方法。

因此,我认为真正的答案取决于上下文。也许你写的真正的课程(不是想象中的形状)不应该被复制,也许它应该。但作为一般方法,我当然不能说用户不应该通过强制他们使用显式的方法调用来阻止用户复制大对象。

2

根据您的需求...

如果你想确保副本不会在无意中发生,并制作一份拷贝会导致严重的瓶颈或根本没有意义,那么这是良好的做法。编译错误优于性能调查。

如果您不确定您的班级将如何使用,并且不确定这是不是一个好主意,那么这不是一个好习惯。大多数时候你不会以这种方式限制你的课程。

4

恕我直言,提供一个拷贝构造函数和赋值操作符,或者不依赖于你的类所建模的东西多于拷贝的代价。

如果你的类代表,即如果传递一个对象或对象的副本不有所作为,然后为他们提供(并提供平等的经营者也)

如果你的类ISN那就是说,如果你认为这个阶级的对象有一个身份和一个国家(其中一个也说实体),那么不要。如果副本有意义,请提供克隆或复制成员。

有时候你不能轻易分类的课程。集装箱就在那个位置。它意味着将它们视为实体并仅通过引用传递它们,并在需要时进行特殊操作以制作副本。你也可以把它们看作是价值的聚合,所以复制是有道理的。 STL是围绕值类型设计的。因为一切都是价值,容器是如此的合理。这允许诸如map<int, list<> >这些有用的东西。 (请记住,您不能将可复制的类放入STL容器中)。

4

一般来说,你不会因为它们很重而让类不可复制(你已经展示了一个很好的例子STL)。

你让他们不可复制的,当他们连接到像插座,文件,锁定一些不可复制的资源或他们不设计在所有被复制(例如具有可深可几乎复制了一些内部结构)。

但是,在你的情况下,你的对象是可复制的,所以请留下它。

关于clone()的小注 - 它用作多态拷贝构造函数 - 它具有不同的含义和用法。

4

大多数程序员已经意识到复制各种对象的成本,并知道如何避免使用诸如传递引用等技术的副本。

注意STL的矢量,字符串,地图,列表等都可以被认为是“重量级”对象(特别是像10000个元素的矢量!)。这些类仍然提供复制构造函数和赋值运算符,因此如果您知道自己在做什么(如创建一个std ::向量列表),则可以在必要时复制它们。

因此,如果它很有用,请提供它们,但一定要记录它们是昂贵的操作。

+0

我喜欢STL容器的例子。 – 2010-03-19 16:51:55

相关问题