2015-11-30 34 views
0

Supose我有一個包含許多領域的一類,和/或在不斷地變化(在開發中),和它的所有字段或者是當地人或不必然-POD類型,其提供一個滿意的拷貝構造,但一個的 - 它甚至可能刪除或私有化其拷貝構造函數,但爲我提供了根據需要執行拷貝的方法。
現在假設我需要它有它自己的拷貝構造函數。
我是必然要通過寫場副本詳盡(排氣)場,或者是有一個更清潔,少接觸到的錯誤,方法來達到同樣的目的?c + +複製構造函數 - 隱式複製除了一個字段的所有?

圖示碼:

class Big { 
public : 
    Big(Big const & big) : ? { ? } 
protected : 
    int i1, i2, ... , i50; 
    float f1, f2, ... , f50; 
    CopyConstructableClass1 c1; 
    CopyConstructableClass2 c2; 
    ... 
    CopyConstructableClass20 c20; 
    NonCopyConstructableClass ncc; 
}; 

感謝

回答

1

通常我在這種情況下做的就是把它可以自己複製到基類中的所有字段。比我可以有一個派生類只有一個領域,這將手動複製。

爲了強調這個基類不應該被單獨使用的事實,謹慎的做法是標記它的析構函數protected。其實,所有的成員都可以。

+0

我在寫下這個問題時想到了它,但它感覺錯了(美觀)。上面的答案有一個更好的方法。 – elad

+0

@elad,這取決於你。我討厭不得不用類名前綴所有內部類的成員,我認爲,這是一個有效的繼承案例。你可能會有不同的美學觀點。 – SergeyA

3

你可以包裝有問題的厭惡類到三立可複製類自己的設計,然後進行現場在你的大,改變類是包裝類型,而不是原來的類型。這樣你只需要在一個地方完成「自定義複製」的工作,並且可以在其他地方重複使用該邏輯。

這是繼單一責任原則,其中規定每個類應該有一個責任,而複雜性是由構成建立的。

0

考慮的東西,將跳過賦值運算符邏輯。作爲一個例子(不是真實代碼):

template <typename T> 
class DontCopyThisField : public T 
{ 
public: 
    template <typename... Args> 
    DontCopyThisField(Args&&... args): 
     T(std::forward<Args>(args)...) 
    { 
    } 

    DontCopyThisField(const DontCopyThisField& from) 
    { 
    } 

    DontCopyThisField(DontCopyThisField&& from): 
     T(static_cast<T&&>(from)) 
    { 
    } 

    DontCopyThisField& operator=(const T& from) 
    { 
     T::operator=(from); 
     return *this; 
    } 

    DontCopyThisField& operator=(T&& from) 
    { 
     T::operator=(std::move(from)); 
     return *this; 
    } 

    DontCopyThisField& operator=(const DontCopyThisField& from) 
    { 
     return *this; 
    } 

    DontCopyThisField& operator=(DontCopyThisField&& from) 
    { 
     T::operator=(static_cast<T&&>(from)); 
     return *this; 
    } 
};