閑古鳥

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

エラーにしてほしい警告

void hoge()
{
	const Hage* obj = GetHage(); 	// const Hage* を返す関数
	obj->Nukege();			// Hage::Nukegeはconstメソッドではない!
}

BCCでは上記のようなコードは警告となり、エラーにはなってくれません。つまり、Hageオブジェクトはconstであるのにも関わらず、Nukegeの中でHageクラスのメンバである毛は無情にも抜けてしまうのです。

ヘルプには次のように書いてありました。

(これはエラーですが,既存のプログラムを動作させられるように,警告として出力されます。)

せめてコンパイルオプションでエラーになるかどうかの切り替えができるようにしてほしいです。使う側で気をつければいいだけなんですが、やっぱり気持ち悪い。

ちなみに上のコードが通るとなぜまずいのかというと:

struct data
{
	// メンバはSetterを通さないと変更できない
	void SetNum(int num) { m_num = num; }
private:
	int m_num;
};

void hoge(const data& d)	// ここではdataは参照するだけにしたいのでconst付き
{
	d.SetNum(1111); 	// しかし、変更できてしまう...
#if 0
	d.m_num = 111; 		// 仮にメンバ変数がpublicだとしても、アクセスはできても
				// 変更はできないのでこっちはコンパイルエラーになってくれる
#endif
}

この例だと値渡しにするという逃げ道があるので、あまりいい例ではないかもしれませんが。

これは知ってた方が良いだろうし、改変して周りの人に配ろうかな。