■
id:ita:20050209
>a.func(x, &a)
sub1(x, &a ) でしょうか?
それはそうと動的に振る舞いを変更したい場合は Strategy パターンを使うといい感じに仕上がります。
例示されていたコード片でいうと以下のような感じです。
#include <iostream> int myint1 = 1, myint2 = 100; struct MyClass; struct StrategyPtn { virtual void sub( int x, MyClass* myclass ) = 0; }; struct MyClass{ int z; StrategyPtn * _strategy; void func( int x ) { _strategy->sub( x, this ); } }; struct Strategy1 : public StrategyPtn { virtual void sub( int x, MyClass* myclass ) { myclass->z = x + myint1; } }; struct Strategy2 : public StrategyPtn { virtual void sub( int x, MyClass* myclass ) { myclass->z = x + myint2; } }; int main( int argc, char** args ) { MyClass a, b; Strategy1 foo1; Strategy2 foo2; a._strategy = &foo1; b._strategy = &foo2; a.func(1); b.func(2); std::cout << " a.z = " << a.z << std::endl; std::cout << " b.z = " << b.z << std::endl; a._strategy = &foo2; b._strategy = &foo1; a.func(1); b.func(2); std::cout << " a.z = " << a.z << std::endl; std::cout << " b.z = " << b.z << std::endl; return 0; }
とはいえ、計算に使うグローバル変数を変更する程度なら素直にメンバ変数に int への参照を持たせて
コンストラクタで代入しちゃうほうが楽だとはおもいます。