繁体   English   中英

通常使重量级课程不可复制是一种好的做法吗?

[英]Is it good practice to generally make heavyweight classes non-copyable?

我有一个Shape类,其中可能包含许多顶点,并且我正在考虑将copy-constructor / copy-assignment设为私有,以防止意外删除我的重量级类(例如,按值传递而不是按引用传递)。

要复制Shape,必须故意调用“克隆”或“复制”方法。

这是好习惯吗? 我想知道为什么STL容器不使用这种方法,因为我很少要按值传递它们。

限制用户并不总是一个好主意。 仅记录复制成本可能就足够了。 如果用户确实想要复制,则通过提供复制构造函数使用C ++的本机语法是一种更干净的方法。

因此,我认为真正的答案取决于具体情况。 也许不应该复制您正在编写的真实类(而不是虚构的Shape),应该复制它。 但是,作为一种通用方法,我当然不能说强迫用户使用显式方法调用来阻止用户复制大型对象。

恕我直言,是否提供复制构造函数和赋值运算符取决于您的类建模的内容而不是复制成本。

如果您的类表示 ,即传递一个对象或该对象的副本没有区别,则提供它们(并提供相等运算符)

如果您的类不是,那就是如果您认为该类的对象具有一个标识和一个状态(也称为实体 ),则不要。 如果需要复制,请为其提供克隆或复制成员。

有时有些类别无法轻松分类。 容器处于该位置。 将它们视为实体并仅通过引用传递它们,并在需要时进行特殊操作以进行复制是完全没有意义的。 您也可以简单地将它们视为价值的集合,因此复制才有意义。 STL是围绕值类型设计的。 而且由于一切都是价值,因此容器是有意义的。 这样就可以使用诸如map<int, list<> >类的东西。 (请记住,您不能在STL容器中放置不可复制的类)。

通常,不要因为类太重而使它们不可复制(您已经展示了一个很好的STL示例)。

当它们连接到某些不可复制的资源(例如套接字,文件,锁)时,或者将它们设计为根本无法复制(例如,有些内部结构很难深度复制),就可以使它们不可复制。

但是,在您的情况下,您的对象是可复制的,因此保持原样。

关于clone()小注释-它用作多态复制构造函数-具有不同的含义并且使用不同。

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

请注意,STL的向量,字符串,映射,列表等都可以被视为“重量级”对象(尤其是类似具有10,000个元素的向量!)。 这些类都仍然提供复制构造函数和赋值运算符,因此,如果您知道自己在做什么(例如创建向量的std :: list),则可以在必要时复制它们。

因此,如果有用,无论如何都要提供它们,但是一定要记录下来它们是昂贵的操作。

根据您的需求...

如果要确保不会错误地进行复制,并且复制会导致严重的瓶颈或根本没有道理,那么这是一个好习惯。 编译错误胜于性能调查。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM