閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

オブジェクトのディープコピーを禁止する

オブジェクトのコピーを禁止しているクラスであれば、コピーコンストラクタと代入演算子をプライベートにすることで、ディープコピーをコンパイル時点で弾いてしまう手もあると思います。

class CSomeImage
{
public:
  CSomeImage() {}
private:
  // コピーコンストラクタと代入演算子のオーバーロード
  // 実装もしない (無理矢理アクセスされても、リンクエラーになる)
  CSomeImage& operator=(const CSomeImage&);
  CSomeImage(const CSomeImage&);
};

void main()
{
  CSomeImage img;
  //CSomeImage copy = img; // Error
  CSomeImage& copy = img;  // OK
}

最初代入演算子だけプライベートにしたら、コンパイルが通って悩んでしまった。コピーコンストラクタと代入演算子の違いをちゃんと理解していなかったようです。やっぱり、基礎が抜けているなあ……。