変数?に関数を代入するには?

解決


miya  2011-03-01 02:18:29  No: 72385

変数?に関数を代入する
なんて事は出来るんでしょうか?

例えば、下記の様な事をしてみたいです。

クラス 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
です


Blue  2011-03-01 02:54:42  No: 72386

クラスのメンバ関数を指定する場合、かならずインスタンスが必要になります。
(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;
}


仲澤@失業者  2011-03-01 03:34:22  No: 72387

んでは、自分は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);
}


仲澤@失業者  2011-03-01 03:39:10  No: 72388

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


miya  2011-03-01 20:20:31  No: 72389

Blueさん、仲澤@失業者さん
回答ありがとうございます。

void (*cmain::m_method)(int, int, int);
なんて宣言のしかたがあったんですね。

勉強になりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加