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;
}

*1


とはいえ、計算に使うグローバル変数を変更する程度なら素直にメンバ変数に int への参照を持たせて
コンストラクタで代入しちゃうほうが楽だとはおもいます。

*1:コンパイルしてみてないので、もしかしたらコンパイル通らないかも。だめだったらごめんなさい