2011-07-25 42 views
7

this question的啓發。爲什麼我會使複製構造函數和賦值運算符爲私有並在C++中實現?

通常使拷貝構造函數和賦值操作符private的原因是爲了make the class non-copyable,這樣才能創建的對象和銷燬,但不會複製 - 大多數時候是因爲它們複製將毫無意義。在這種情況下,複製構造函數和賦值運算符都是private並且未實現 - 如果類不可複製,則無人複製。

是否有複製構造函數和賦值運算符需要爲private並且同時具有有意義的實現的情況?

+0

在C++中讀取0x的被刪除的函數,這是通過使用'= delete'而不是跳過箍環的這種類型的語法糖。 – rubenvb

+1

這不是另一個問題的謎團嗎?另一個沒有指定*僅*具有實現的私有構造函數,但至少有一個答案(http://stackoverflow.com/questions/6811037/whats-the-use-of-the-private-copy-constructor-in- c/6811507#6811507)涉及這一點。 –

+0

@Steve Jessop:問題是讓他們私密的頭號原因是爲了防止完全複製,然後他們沒有實現,這就是大多數人(我也一樣)在被問及這個問題時想到的。由於我對「私人+實施」場景特別感興趣,因此我不得不提出這個問題並強調具體的重點。 – sharptooth

回答

7

有兩種情況立即浮現在腦海:

  1. friend S:

    說作爲你設計的一部分,你有兩個高度耦合的類,其中一個需要能夠複製另一個(比如工廠模型或其他類型),但你不想讓整個世界都能夠複製它。

  2. 包裝:

    說你希望能夠有條件地克隆了一些元素,根據一些內部行爲(例如,根據某些類有狀態條件) - 最徹底的方法,從語言的角度 - 是仍然要將複製分成它自己的功能。這樣可以很好地區分顧慮。

+0

+1,我們的答案非常相似。 :) – iammilind

7

我的猜測是,這對於持有自身列表的類非常有用 - 那麼它可以在內部複製實例。這確實是唯一有用的一類,它是兩個項目和容器:

class MyItems 
{ 
private: 
    /* Copy ctor and =operator */ 
    List list; 
public: 
    void AddItems(MyItems* items) 
    { 
     MyItems* added = new MyItems(items); 
     list.Add(added); 
    } 
}; 

另一個想法是允許通過類控制情況克隆。這可能是有用的,當複製是有意義的,但只能在特定條件或權限:

class MyClass 
{ 
private: 
    /* Copy ctor and =operator */ 
public: 
    MyClass* clone() 
    { 
     if (canClone) 
     { 
      MyClass* cloned = new MyClass(this); 
      return cloned; 
     } 
     else 
     { 
      return NULL; 
     } 
    } 
}; 
+1

爲什麼你想禁止客戶在第一個例子中製作副本? –

+1

@Martinho:'List'對象可能不會擁有'List :: add'的所有權。因此,在第一個例子中保持客戶端不會創建副本,不必擔心誰在'list'成員中擁有'MyItem'實例。 –

5
  1. 我們做拷貝構造函數和operator =未實現這樣即使 一個friend不能有任何訪問。如果實施,則意味着您要friend有權訪問 。這是一個設計決定。
  2. 你想做顯式克隆;即允許複製,但也 使其代碼「髒」看(類似於C++風格鑄造 操作,這說明dirt in your code

例如

class A { 
    A(const A& obj) { ... } 
    A& operator = (const A& obj) { ... } 
public: 
    A& clone(const A& obj) 
    { 
    *this = obj; 
    return *this; 
    } 
}; 

我們已經把這個包裝clone()允許克隆用戶,但它也顯示明確究竟是什麼,他/她在做什麼。

相關問題