簡體   English   中英

為什么boost :: noncopyable需要繼承

[英]why does boost::noncopyable require inheritance

將任何不可復制的成員添加到類將阻止自動生成復制構造和賦值運算符。 為什么boost需要繼承才能使用noncopyable?

我想我並不孤單

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

而不是

class MyUtility : public MyBase , private noncopyable
{
   ...
};

戴夫亞伯拉罕是一個聰明人,所以他可能考慮過這種可能性。 我錯過了什么? 遺產成就了什么?

因為sizeof(boost::noncopyable)!=0 所以在這種情況下,你的班級規模會更大。

在這里,您可以閱讀空基優化。 (請參閱“4.7:空成員優化”部分)。

編輯:事實上,noncopyable沒有公共構造函數使得它對任何其他用途都沒用,而具有公共構造函數的類也可能用於其他錯誤的目的。 這是另一個原因,為什么加速選擇這種方法。

如果您可以使用noncopyable作為成員,則需要公共默認構造函數和析構函數。 然后人們可以創建不可noncopyable實例,甚至可以將其用作多態基類而不使用析構函數。 沒有任何公共成員的實現只是確保它僅用作策略類。

就個人而言,我更喜歡boost語法。 繼承是一種向整個類添加一些屬性或特性的方法,而noncopyable就是這樣一種特性。 不可復制的成員似乎很棘手(你實際上不想添加任何成員,這是一個技巧)。 繼承精確地用於它的設計目的。

最明顯的原因是派生類“isA”不可復制,因此使用繼承最有意義。 以這種方式使用它不會增加類的大小這一事實今天也是一個考慮因素(但我認為在空基類優化之前不可復制)。

如果省略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 {};

我自己也遇到了這個設計決定,並且認為將其作為成員的額外自我記錄實際上是值得的。 例如,有人可能會質疑“為什么課程不可復制?”。

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

現在這特別告訴我該類是不可復制的,因為如果OpenGL VBO被釋放兩次,那將是一個錯誤。

例如,在前面的示例中; 我可以復制一條狗,為什么你的車太特別了,我無法復制它?

我再次使用零初始化/ valueinitialized之類的內容,以便在使用它之前我不需要確保已經分配了這些變量。

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

我參加這個派對有點晚了但是有沒有人有更多的建議呢?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM