2012-03-14 155 views
0

是否可以使用函數指針指向非靜態成員函數?我想指出一個成員函數,它使用類中的非靜態對象和變量...靜態成員函數不能這樣做...函數指向非靜態成員函數的指針?

我有一個成員函數指向四個靜態成員函數之一。問題是四個成員函數中的每一個要使用的數據都是非靜態的,所以靜態成員函數將不會訪問它們...

我可以指向非靜態成員函數嗎?

此外,類的實例是一個指針...這裏是我的代碼:

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_索引」

+3

「*是否有可能被用來使用一個函數指針指向一個非靜態成員函數?*「不,但可以使用_member函數指針_指向一個非靜態成員函數... – ildjarn 2012-03-14 23:15:28

+0

我看到了區別謝謝...發現了一篇關於成員函數的文章指針... http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible – 2012-03-14 23:27:08

+1

見http://www.parashift.com/c++-faq-lite/pointers -to-members.html – 2012-03-14 23:27:46

回答

1

只要您可以修改其存儲類型即可。

使用std :: function摘要,你可以綁定任何符合特定簽名的東西(即把x返回y)。是它的函數,lambda,綁定成員函數或自由函數。

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

相關問題