• 締切済み

メンバ変数が変更されそうなconstメンバ関数

c++のconstメンバ関数についての質問です。 以下のコードの様に、constメンバ関数で メンバ変数を変更しているように見える場合、 本来はどのように記述すべきか? class foo { public: foo(){} foo(int i){ d = i; } void hoge(foo *dest0, foo *dest1 ) const { dest0->d = d*2; dest1->d = d*4; } int d; }; int main() { foo f(1); foo p,q; f.hoge(&p,&q); std::cout << f.d << "\n"; std::cout << p.d << "\n"; std::cout << q.d << "\n"; f.hoge(&f,&q); std::cout << f.d << "\n"; std::cout << q.d << "\n"; return 0; } ちなみに出力期待値は 1 2 4 2 4 とします。 上のコードは 1 2 3 2 8 と出力されますが、このようなことが無いように実装するには どうすべきかという質問です。 dest0->d = d*2; dest1->d = d*4; の所を int i=d; dest0->d = i*2; dest1->d = i*4; とすべき? それともhogeの最初に if( (this == dest0) || (this == dest1) || (dest0== dest1) ){ throw "同じオブジェクトじゃだめ"; } とすべき? どんな書き方が安定でしょうか?

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「意味からいって同じオブジェクトを指定できるかどうか」がまず問題で, 「同じオブジェクトを指定する意味がある」なら前者, 「無意味である」あるいは「してはならない」なら後者の形になるんでは? もっとも, このようなメンバー関数を作らなければならないとしたら「設計が間違っている」ような気もするんだけど....

ICE_FALCON
質問者

お礼

回答ありがとうございます。 > 「同じオブジェクトを指定する意味がある」なら前者, 「無意味である」あるいは「してはならない」なら後者の形になるんでは? やはり場合によりけりですか。 > 「設計が間違っている」ような気もするんだけど.... うーん、2つ以上同時に戻したい場合はこうなるような気がしますが・・・・。

関連するQ&A