为什么boost :: noncopyable需要继承

时间:2011-01-28 15:07:15

标签: c++ boost noncopyable

将任何不可复制的成员添加到类中将阻止自动生成复制构造和赋值运算符。为什么boost需要继承才能使用noncopyable?

我认为我的风格偏好并不孤单

class MyUtility : public MyBase
{
   noncopyable guard;
   ...
};

而不是

class MyUtility : public MyBase , private noncopyable
{
   ...
};
戴夫亚伯拉罕是一个聪明人,所以他可能考虑过这种可能性。我错过了什么?遗产有什么作用?

6 个答案:

答案 0 :(得分:33)

因为sizeof(boost::noncopyable)!=0。所以在这种情况下,你的班级规模会更大。

Here您可以阅读有关空基础优化的信息。 (请参阅“4.7:空成员优化”一节)。

编辑:事实上,noncopyable没有公共构造函数使得它对任何其他用途都没用,而具有公共构造函数的类也可能用于其他错误的目的。这是另一个原因,为什么助推选择了这种方法。

答案 1 :(得分:23)

如果您可以使用noncopyable作为成员,则需要公共默认构造函数和析构函数。然后人们可以创建noncopyable的实例,甚至可以将其用作多态基类而不使用析构函数。没有任何公共成员的实施只是确保它仅用作政策类。

答案 2 :(得分:4)

就个人而言,我更喜欢boost语法。继承是一种向整个类添加一些属性或特性的方法,而noncopyable就是这样一种特性。不可复制的成员似乎很棘手(你实际上不想添加任何成员,这是一个技巧)。继承精确地用于它的设计目的。

答案 3 :(得分:4)

最明显的原因是派生类“isA”不可复制,因此使用继承最有意义。以这种方式使用它不会增加类的大小这一事实今天也是一个考虑因素(但我认为在空基类优化之前不可复制)。

答案 4 :(得分:0)

如果省略private名称,它就会变得像英语:

// English: this is my car, it is not copyable
class MyCar: noncopyable {};

// my truck is noncopyable, did i mention it's also a vehicle?
class MyTruck: noncopyable, public MyVehicle {};

// My airplane is a vehicle, BTW it's not copyable
class MyAirplane: public MyVehicle, noncopyable {};

答案 5 :(得分:0)

我自己遇到了这个设计决策,并认为将其作为成员的额外自我记录实际上是值得的。例如,有人可能会问“为什么该类不可复制?”。

class VertexBuffer
{
   std::sr1::noncopyable<GLint> m_vbo;
   ...
};

这现在专门告诉我该类不可复制,因为如果OpenGL VBO被释放两次,那将是一个错误。

例如,在前面的示例中;我可以复制一条狗,那为什么您的车如此特别以至于我无法复制它?

我将其与零初始化/值初始化之类的东西再次结合在一起,以获得不需要使用这些变量之前便已分配这些变量的其他文档。

class VertexBuffer
{
   std::sr1::noncopyable<GLint> m_vbo;
   std::sr1::zeroinitialized<int> m_vertexCount;
};

我参加这个聚会有点晚了,但是还有人建议吗?