2017-09-06 7 views
2

私はPODメンバーを含むクラスを持っています。私はすべてのメンバーをコピーする必要がありますが、1つのメンバー(この例ではメンバーa)は例外です。メンバー変数をコピーしないとマークする

class Example 
{ 
private: 
    int a = 0; 
    int b = 0; 
    int c = 0; 
    int d = 0; 
    double e = 0; 

public: 
    Example& operator=(const Example &rhs) 
    { 
     b = rhs.b; 
     c = rhs.c; 
     d = rhs.d; 
     e = rhs.e;   

     return *this; 
    } 

    Example() {}; 

    Example(const Example& toCopy) 
    { 
     *this = toCopy; 
    } 
}; 

はコピーしないために、変数をマークする方法はあります、私は後でこのクラスを変更する場合は、この方法では、バグに冗長で傾向がある、それをやって次のように私は今それをやっている方法はありますか?

+0

@FrançoisAndrieux良い点。それに応じてコードを修正しました –

+0

本当に 'a'をメンバーにしなければなりませんか?私はコピーコンストラクタや代入演算子からすべてのメンバーをコピーすることを期待しています。それ以外のものは多少混乱します。 –

答えて

3

あなたは構造体で、「仲間外れ」、aをラップし、個別にその構造体の振る舞いを定義することができます。私は、デフォルトのでもうExampleための特別なメンバーを書く気にしませんでした

class Example 
{ 
private: 
    CopyLess a; 
    int b = 0; 
    int c = 0; 
    int d = 0; 
    double e = 0; 

    struct CopyLess { 
     int a = 0; 
     CopyLess& operator=(const CopyLess&) { return *this; } 
     CopyLess(const CopyLess&) {} 
    };    
}; 

注意をあなたが望むことをやりなさい。特別会員を可能な限り書くことを避けるために、このようにコードを書くことは、「ゼロの法則」と呼ばれ、より多くの情報と例:http://www.nirfriedman.com/2015/06/27/cpp-rule-of-zero/と呼ばれています。

+0

@ user2079303よろしくお願いします。 –

+1

良い解決策。また、あなたのブログ記事を読んで楽しんだ –

0

いいえ、暗黙的なコピー割り当てのスキップメンバーを作成することはできません。以前と同じようにカスタム代入演算子を定義することが、目的の動作を実現する方法です。単一サブオブジェクトに

私は後で、このクラスに

を変更する場合は、この方法では、冗長とバグの傾向があることができますそれをやってグループメンバーにコピー。このようにして、カスタムコピーの割り当ては変更に脆弱ではなく、コピーされたメンバーの数に関連して冗長性は一定のままです。

ボーナス:メンバーの値の初期化を個別に指定する必要はありませんが、サブオブジェクト全体に対して1つの値で十分です。

class Example 
{ 

    int a = 0; 
    struct { 
     int b; 
     int c; 
     int d; 
     double e; 
    } state = {}; 

public: 
    Example& operator=(const Example &rhs) 
    { 
     state = rhs.state; 
     return *this; 
    } 
... 

メンバーはプライベートなので、クラスの既存のAPIは変更されません。

関連する問題