2009年4月1日水曜日

constなメンバ変数を持つクラス


class Test
{
private:
  const int m_val;

public:
  Test( int num )
    : m_val( num )
  {}

  int getVal() const { return m_val; }
};

 ってなクラスを作成しコンパイルしたところ、
warning C4512: 'Test' : 代入演算子を生成できません。
と怒られてしまった。
メンバからconstをはずすと問題なくコンパイルが通る。

 考えてみれば、

Test t(10), tt(100);
t = tt;

なんてこともできちゃう訳だけど、メンバがconstだからコピー出来ない。
 そんなわけで、

class Test
{
private:
  int m_val;
  const Test& operator = ( const Test& );

public:
  Test( int num )
    : m_val( num )
  {}

  int getVal() const { return m_val; }
};

と、このように明示的にコピーを不可能にすることで、コンパイルが通るようになる。

 30分ほどなんでよーって悩んだ。
コンパイルが出来たり出来なかったりして意味がわからなかったが、
共通点を探すとコピー不可にしていたことから、あー、なるほどってな具合。
ググってもぱっと出てこなかったので記述しておく。

0 件のコメント: