你多久一次实施三巨头?

时间:2010-05-01 13:26:45

标签: c++

我只是在思考这里的问题数量,要么是关于“三巨头”(复制构造函数,赋值运算符和析构函数),要么是因为它们没有被正确实现而导致的问题,当我发现我能够不记得我上次自己实施它们了。对我最活跃的两个项目进行了快速的grep表明,我在大约150个类中仅实现了所有三个类。

这并不是说我没有实现/声明它们中的一个或多个 - 显然基类需要一个虚拟析构函数,而且我的大量类禁止使用私有副本ctor& amp;作业成语。但是完全实现了,有一个孤独的类,它做了一些引用计数。

所以我想知道我不寻常吗?你经常实施所有这三个功能?您实现它们的类是否有任何模式?

6 个答案:

答案 0 :(得分:2)

我认为你很少需要这三个。大多数需要显式析构函数的类都不适合复制。

使用自毁成员(通常不需要复制构造之类的东西)比使用大型显式析构函数更好的设计。

答案 1 :(得分:1)

和你一样,几乎从不。

但是我没有依赖于编程的STL方法,你可以在容器中复制所有东西 - 通常如果它不是原始的,我会使用指针,智能或其他。

我主要使用RAII模式,因此避免编写析构函数。虽然,我确实在我的.cc文件中放置了空体,以帮助防止代码膨胀。

并且,和你一样,我会声明它们是私有的并且没有实现,以防止任何意外调用。

答案 2 :(得分:1)

我很少实现它们,但经常将它们声明为私有(复制构造函数和赋值运算符)。

答案 3 :(得分:0)

大部分时间,几乎没有。这是因为使用的成员(基于引用的智能ptr等)已经实现了正确的语义,或者该对象是不可复制的。

当我发现自己实施这些模式时会出现一些模式:

  1. 破坏性复制,即移动模式,如auto_ptr或lock
  2. 处理模式几乎不会出现在C ++中,但我在我的职业生涯中使用了大约三次(实际上只是一周前)
  3. pimpl模式,其中pimpl是在标头中声明的fwd,并由智能ptr管理。然后空的dtor进入.cc文件但仍归类为“not complier generated”
  4. 还有一个琐碎的打印“我被摧毁了”,当我想我可能在某个地方有一个循环引用而只是想确定。

答案 4 :(得分:0)

这实际上取决于您正在处理的问题类型。我过去几个月一直在研究一个新项目,我认为每个类都继承自boost :: noncopyable。九个月前,我参与了一个使用POD的不同项目,我利用了自动复制ctor和赋值运算符。如果你正在使用boost :: shared_ptr(你应该这样做),现在编写自己的copy ctor或赋值运算符应该很少见。

答案 5 :(得分:0)

拥有某些指针成员的任何类都需要定义这三个操作来实现深层复制(有关深层描述,请参阅here)。