boost::noncopyable

今日粗看boost的代碼,發現很多類都繼承noncopyable,以下是noncopyable的代碼:
class noncopyable
  {
   protected:
      noncopyable() {}
      ~noncopyable() {}
   private:  // emphasize the following members are private
      noncopyable( const noncopyable& );
      const noncopyable& operator=( const noncopyable& );
  };

這裏的設計思想是讓子類繼承,但是阻止子類調用賦值和copy構造函數,有什麼用呢?
寫代碼的時候我經常喜歡用singleton模式,比如那些工廠類,管理者類之類的,但是寫這些
singleton的時候當然是希望全局只有一個,而且不希望別人在用的時候又自己創造一個,往往
就要每寫一個singleton類就要在類的declaration中把它們的構造函數,賦值函數,析構函數,copy構造函數隱藏到
private或者protected之中,這樣真的很累。
  現在好了,只要讓這些singleton直接繼承noncopyable就ok了。這樣至少可以不用多寫賦值和copy構造
函數了;構造和析構函數看情況而定了。

class noncopyable的基本思想是把構造函數和析構函數設置protected權限,這樣子類可以調用,但是外面的類不能調用,
那麼當子類需要定義構造函數的時候不至於通不過編譯。但是最關鍵的是noncopyable把copy構造函數和copy賦值函數做成了
private,這就意味着除非子類定義自己的copy構造和賦值函數,否則在子類沒有定義的情況下,外面的調用者是不能夠通過
賦值和copy構造等手段來產生一個新的子類對象的。舉個簡單的例子:
class Test : public noncopyable
{
};

void main()
{
   Test a,c;
   Test b(a);  ///<------(1) error

   c = a;     ///<------(2) error
}

如果Test類沒有繼承 noncopyable,那麼(1)和(2)都可以通過編譯,但是一旦Test繼承了noncopyable,則(1)和(2)都通不過
編譯,從而可以防止調用者寫一些錯誤的代碼,這不正是我們做singleton對象所需要的嗎?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章