ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

すべてコピーするように

Effective C++ 第2章12項
コピーコンストラクタやコピー代入演算子ではオブジェクト全体をコピーするようにして、コピーし忘れたデータが無いようにしなくてはならない。
たとえば、途中からメンバ変数を追加した場合は、コピーコンストラクタやコピー代入演算子のほうにもそのメンバ変数をコピーする処理を追加するのを忘れないように。
また、継承したクラスの場合は継承元のコピーも忘れないように。

class Test : public Base {
private:
    Data m_Data;
public:
    Test(const Test& rhs);
    Test& operator=(const Test& rhs);
};

Test::Test(const Test& rhs)
    : Base(rhs), // 基底クラスのコピーコンストラクタの呼び出し
      m_Data(rhs.m_Data)
{
}

Test& Test::operator=(const Test& rhs)
{
    Base::operator=(rhs);  // 基底クラスのコピー代入演算子の呼び出し
    m_Data = rhs.m_Data;
    return *this;
}

コピーコンストラクタとコピー代入演算子は似たような処理だからと、どちらか一方から別の方を呼び出すということはしてはならない。共通部分を取りだして別の関数とし、それをそれぞれの関数から呼び出すようにする。