変数?に関数を代入する
なんて事は出来るんでしょうか?
例えば、下記の様な事をしてみたいです。
クラス CSample の SetMethod へ関数(test1 または test2)を設定し
Run() を呼びだすと、SetMethod で設定した関数が呼ばれる
※ 設定する関数の引数、戻り値は同じです。
CSample m_sample;
void cmain::main()
{
if (...)
{
m_sample.SetMethod(test1);
}
else
{
m_sample.SetMethod(test2);
}
m_sample.Run();
}
void cmain::test1(int a, int b, int c)
{
}
void cmain::test2(int a, int b, int c)
{
}
class CSample
{
変数? m_method;
void SetMethod(変数? method)
{
m_method = method;
}
void Run()
{
m_method(1, 2, 3);
}
}
環境は
VC++6
MFC
です
クラスのメンバ関数を指定する場合、かならずインスタンスが必要になります。
(static関数ならいらないけど)
以下適当なサンプル
struct Hoge
{
int x;
Hoge(int n) : x(n) {}
int Add(int y) { return x + y; }
int Sub(int y) { return x - y; }
};
struct Moge
{
Hoge* pHoge;
int (Hoge::*pCalculater)(int);
void SetCalculater(Hoge* p, int (Hoge::*pFunc)(int)) {
pHoge = p; pCalculater = pFunc;
}
int Calculate(int y) {
return (pHoge->*pCalculater)(y);
}
};
int main()
{
Hoge h(10);
Moge m;
m.SetCalculater(&h, &Hoge::Add);
int z = m.Calculate(10); // z = 20
m.SetCalculater(&h, &Hoge::Sub);
z = m.Calculate(10); // z = 0
return 0;
}
んでは、自分はstaticの場合の例を・・・。
class CCC
{
typedef void( *CCC::Func_XXXX)( int a, int b, int c);
protected:
static void Func_CASE_0( int a, int b, int c){}
static void Func_CASE_1( int a, int b, int c){}
static void Func_CASE_2( int a, int b, int c){}
public:
Func_XXXX Func_XXX;
void SetUp( int CaseX)
{
switch( CaseX){
case 0: Func_XXX = &CCC::Func_CASE_0;
case 1: Func_XXX = &CCC::Func_CASE_1;
case 2: Func_XXX = &CCC::Func_CASE_2;
}
}
};
/// 実際にセットアップして、呼び出してみる
foo()
{
CCC c;
c.SetUp( 1);
c.Func_XXX( 1, 2, 3);
}
break;が抜けてますねorz。
void SetUp( int CaseX)
{
switch( CaseX){
case 0: Func_XXX = &CCC::Func_CASE_0; break;
case 1: Func_XXX = &CCC::Func_CASE_1; break;
case 2: Func_XXX = &CCC::Func_CASE_2; break;
}
}
Blueさん、仲澤@失業者さん
回答ありがとうございます。
void (*cmain::m_method)(int, int, int);
なんて宣言のしかたがあったんですね。
勉強になりました。
ありがとうございました。
ツイート | ![]() |