2012-03-14 9 views
0

非静的メンバー関数を指すために関数ポインタを使用できますか?私は非静的なオブジェクトとクラスからの変数を使用するメンバ関数を指したいと思います...静的なメンバ関数はこれを行うことはできません...機能非静的メンバー関数へのポインタ?

私は4つの静的メンバ関数の1つを指すメンバ関数を持っています。問題は、4つのメンバー関数のそれぞれで使用されるデータが非静的なので、静的メンバー関数はそれらにアクセスしないということです...

非静的メンバー関数を指すことができますか?

また、クラスのインスタンスはポインタがある...ここに私のコードです:

class CRoutine{ 
int m_index; 
    ... 
     BOOL (*CallRoutine(char opcode))(DWORD, float, float, float); 
     static BOOL Update(DWORD, float, float, float); 
     static BOOL Transition(DWORD, float, float, float); 
     static BOOL Revert(DWORD, float, float, float); 
     static BOOL Sequence(DWORD, float, float, float); 
    ... 
    }; 
    BOOL (*CRoutine::CallRoutine(char opcode))(DWORD, float, float, float) 
    { 
     switch (opcode) 
     { 
     case 0: 
      return &CRoutine::Update; 
     case 1: 
      return &CRoutine::Transition; 
     case 2: 
      return &CRoutine::Revert; 
     case 3: 
      return &CRoutine::Sequence; 
     default: 
      return &CRoutine::Update; 
     } 
    } 
    BOOL CRoutine::Update(DWORD AnimSetIndex, float time, float tTime, float shift) 
    { 
     MessageBox(NULL, L"Updating", L"Routine #1", MB_OK); 
     CRoutine::m_index++; // Error thrown here...  
return true; 
    } 
    BOOL CRoutine::Transition(DWORD AnimSetIndex, float time, float tTime, float shift) 
    { 
     MessageBox(NULL, L"Transitioning", L"Routine #2", MB_OK); 
     return true; 
    } 
    BOOL CRoutine::Revert(DWORD AnimSetIndex, float time, float tTime, float shift) 
    { 
     MessageBox(NULL, L"Reverting", L"Routine #3", MB_OK); 
     return true; 
    } 
    BOOL CRoutine::Sequence(DWORD AnimSetIndex, float time, float tTime, float shift) 
    { 
     MessageBox(NULL, L"Sequencing", L"Routine #4", MB_OK); 
     return true; 
    } 

上記のエラーがスローされます。 エラーC2597:非静的メンバ「CRoutine :: m_index」への不正な参照

+3

「*を使用することができ非常によく似たバージョンを持っている関数ポインタを使用することが可能です非静的メンバー関数を指すようにするには?* "いいえ、しかし、非静的メンバー関数を指すために_member関数pointer_を使用することは可能です... – ildjarn

+0

私は違いを見ました...メンバー関数に関する記事が見つかりましたポインタ... http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible –

+1

http://www.parashift.com/c++-faq-lite/pointersを参照してください。 -to-members.html –

答えて

1

保存されているタイプを変更できる場合は、可能です。

std :: function abstractを使用すると、特定の署名を満たすものにバインドできます(つまり、xを返すy)。ファンクタ、ラムダ、バウンドメンバ関数、またはフリー関数です。

struct bar{ 
    void foo(){ 
      std::cout << "HI" << std::endl; 
    } 
}; 

int main(){ 

    bar b; 
    //using std::function instead of a func* 
    std::function<void()> func(
       std::bind(&bar::foo, &b)); 

    func(); 
} 

ノートのstdの使用::関数はC++ 11を必要とし、ブーストはあまりにもそれがC++ 98

関連する問題