代入演算子の内部で浅いコピーを作る

私は手動で割り当てたくないメンバーがたくさんあるクラスの代入演算子を実装する必要があります。最初に浅いメモリコピーを作成してから、必要な初期化を実行できますか?

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

    .........
};

ありがとう。

0
@mcnicholls: = を実装する理想的な方法は、コピーとスワップイディオムです。
追加された 著者 Alok Save,
私は確信していませんが、まず自己割り当てを確認する必要があります。例えばif(this ==&rhs)が* thisを返します。
追加された 著者 mcnicholls,
@Als:はい、私はこのメソッドを見て回想し、それを行うための最善の方法のように見えます。
追加された 著者 mcnicholls,

3 答え

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

可能な解決策の1つは、データでネストされたPODタイプを定義することです メンバーに割り当て、単純に割り当てます(例:

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

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

2
追加された

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

1
追加された

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

私は並んでいる

memcpy(this, *rhs, sizeof(C));
0
追加された
修正しました、ありがとうございます。
追加された 著者 jackhab,