2014-06-15 82 views
0

這可能會被延遲,並且我已經搜索並嘗試了很多解決方案,但是我總是遇到錯誤。無法通過函數指針執行類函數C++

class mainStateMachine; 
typedef void (mainStateMachine::*StateProc)(EIndication input); 

class mainStateMachine 
    {  
     public: 
      StateProc currentState; 
      int transition; 
      void rotateUntilBlobsFound (EIndication input); 
      void clarifyImage    (EIndication input); 
     } 

然後:

main() 
{ 
    int input=0; 
    StateProc BLA; 
    mainStateMachine mainMachine; 
    mainMachine.currentState=&mainStateMachine::rotateUntilBlobsFound; 

    BLA=mainMachine.currentState; 

    BLA(input); 
} 

由於某種原因,這並不工作,告訴我:「必須使用或‘ - >’叫指針到成員函數「BLA‘。’ (...)「,但即使我做* BLA(輸入);它不起作用。 我真的不明白爲什麼這不起作用。

+0

BLA需要一個指向實例的指針 – 4pie0

+0

'mainMachine。* BLA'應該可以工作。 – Philipp

+0

是的,這工作非常感謝,現在看起來很明顯! – user3742604

回答

1

BLA需要一個指向實例的指針,因爲成員函數指針無法直接由它們自己解除引用(調用它們的函數)。它們必須代表某個對象被調用,然後提供「this」指針供成員函數使用。如果函數不知道它在哪個對象上運行,你還可以做什麼來影響對象的實現。

因此,這是你可以調用分配給BLA的方法:

(mainMachine.*BLA)(input); 

你也可以考慮boost::functionstd::function,而不是原始指針,以緩解操作,例如:

std::function< void(const mainStateMachine&, EIndication)> f_ptr = 
              &mainMachine::rotateUntilBlobsFound; 
    const mainStateMachine foo; 
    f_ptr(foo, EIndication()); 

example

+0

感謝您的徹底解答! – user3742604

+0

我爲您服務先生。 – 4pie0

0

除了其他的錯誤,例如類定義之後沒有分號和main沒有返回類型,指向成員的指針需要一個對象來操作。您可以通過使用該成員指針操作者提供一個:

(mainMachine.*BLA)(input); 

作爲一個指針指向一個成員函數,所有BLA包含一個成員函數的地址,沒有任何物體與它的使用。

+0

謝謝,這確實有效。是的,其他問題並不是真的在原來的程序中,我拿走了相關部分並忘記了這些東西。謝謝! – user3742604

+0

@ user3742604,在未來的問題中提供[MCVE](http://stackoverflow.com/help/mcve)是明智的。人們可以採取的措施,粘貼到編輯器中,編譯並可能修復。 – ghostofstandardspast

+0

我不明白BLA =&mainStateMachine :: currentState;將會工作,因爲BLA應該等於mainMachine對象的.currentState。這相當於什麼? – user3742604