2012-02-06 7 views
0

手作業で割り当てたくないたくさんのメンバーを持つクラスの代入演算子を実装する必要があります。最初に浅いメモリコピーを作成してから、必要な初期化を実行できますか?割り当てオペレータの内部でシャローコピーを作成する

class C 
{ 
    public: 
    C &operator=(const C &rhs) 
    { 
     if (&rhs == this) 
      return *this; 
     memcpy(this, &rhs, sizeof(C)); 
     Init(rhs); 
     return *this; 
    } 

    ......... 
}; 

ありがとうございました。

+0

私はわからないんだけど、最初に自己割り当てのために確認する必要があります。例えばif(this ==&rhs)が* thisを返します。 – mcnicholls

+3

@mcnicholls: '='を実装する理想的な方法は** Copy and Swap Idiom **です。 –

+0

@Als:はい私はこのメソッドを見て、それを行う最良の方法のように見えることを思い出してください。 – mcnicholls

答えて

1

まあまあですが、コピーされたポインタメンバー(もしあれば)はすべて同じオブジェクトを指していて、そのオブジェクトが有効範囲外になると、それを参照する他のすべてのオブジェクトのためのぶら下がりポインタが残されます。

2

オブジェクトにPODタイプがない限り、これは未定義の動作です。 ユーザー定義の代入演算子は、それがPODではないことを意味します。そして 練習では、いくつかの理由で失敗する可能性があります。

一つの可能​​な解決策は、例えば、データ メンバーとネストされたPOD型を定義し、単にそれを割り当てることです。もちろん

class C 
{ 
    struct Data { /* ... */ }; 
    Data myData; 
public: 
    C& operator=(C const& other) 
    { 
     myData = other.myData; 
     return *this; 
    } 
}; 

を、それはあなたが常にとして、各メンバー を参照する必要があることを意味します単純にxではなく、myData.xとなります。

0

*演算子を使用してC++参照を逆参照しようとしています。このクラスにoperator *が定義されていない限り、うまく動作しません。

私はラインに意味

memcpy(this, *rhs, sizeof(C)); 
+0

固定、ありがとうございます。 – jackhab

関連する問題