みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

メンバ変数が変更されそうな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 "同じオブジェクトじゃだめ";
}
とすべき?
どんな書き方が安定でしょうか?

投稿日時 - 2009-11-28 00:42:59

QNo.5481368

暇なときに回答ください

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

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

投稿日時 - 2009-11-28 01:07:43

お礼

回答ありがとうございます。
> 「同じオブジェクトを指定する意味がある」なら前者, 「無意味である」あるいは「してはならない」なら後者の形になるんでは?

やはり場合によりけりですか。

> 「設計が間違っている」ような気もするんだけど....
うーん、2つ以上同時に戻したい場合はこうなるような気がしますが・・・・。

投稿日時 - 2009-11-30 21:06:45