2015-10-13 171 views
1

我的問題是關於從A類傳遞一個成員函數,在B類的成員函數:如何將成員函數傳遞給另一個成員函數?

我想是這樣的:

typedef void (moteurGraphique::* f)(Sprite); 
f draw =&moteurGraphique::drawSprite; 
defaultScene.boucle(draw); 

moteurGraphique是A類,moteurGraphique::drawSprite是成員功能,

defaultScene是B類的一個實例,而boucle是B成員函數。

所有被稱爲A的成員函數:

void moteurGraphique::drawMyThings() 

我嘗試不同的方法來做到這一點,一個在我看來,更合乎邏輯,但它不會工作! 我:

Run-Time Check Failure #3 - The variable 'f' is being used without being initialized. 

我認爲我做錯了什麼,有人可以解釋我的錯誤?

+0

什麼編譯您使用其運行時檢查這樣的事情? – leemes

+0

你需要發佈實際的代碼,而不是「這樣的事情」。 – molbdnilo

+0

建議:請記住,成員函數綁定到對象。 – 101010

回答

3

C++ 11路:

using Function = std::function<void (Sprite)>; 

void B::boucle(Function func); 
... 

A a; 
B b; 

b.boucle(std::bind(&A::drawSprite, &a, std::placeholders::_1)); 
+0

這仍然行不通,我做了c + +正常的方式,非常感謝您嘗試 –

1

你不能讓drawMyThing靜態功能,如果你不需要實例化一個,然後像做:

defaultScene.boucle(A.drawMyThing(mySpriteThing)); 

+0

是的,我可以做到這一點,但我想保持動態, –

2

成員函數需要在對象上調用,因此僅傳遞函數指針是不夠的,還需要該對象調用該指針。您可以將該對象存儲在要調用該函數的類中,在調用該函數之前創建它,或者將它與函數指針一起傳遞。

class Foo 
{ 
public: 
    void foo() 
    { 
     std::cout << "foo" << std::endl; 
    } 
}; 

class Bar 
{ 
public: 
    void bar(Foo * obj, void(Foo::*func)(void)) 
    { 
     (obj->*func)(); 
    } 
}; 

int main() 
{ 
    Foo f; 
    Bar b; 
    b.bar(&f, &Foo::foo);//output: foo 
} 
+0

我想我會這樣做,因爲我很害怕,其他方式不會工作。 我知道成員函數附加到執行的對象,但我想要一種動態綁定的方式,謝謝! –

+0

它工作正常,謝謝! –

相關問題