2014-02-14 63 views
0

所以基本上我在遊戲中製作按鈕,而按鈕就是一個叫做Button的按鈕。 我想要存儲的函數叫做SoccerLevelsClass。我試過尋找函數指針,但我不確定發生了什麼,但我認爲這是正確的事情。我可以將一個類的函數傳遞給另一個類的構造函數,並將它存儲在那裏以便稍後調用? C++

我想將ButtonLevelsClass的功能保存爲Button的成員。 我會做這樣的事嗎?

//MenuButton.h 

#ifndef MenuButton 
#define MenuButton 
.... 

class Button 
{ 
public: 
     Button(void(*SoccerLevelsClass::func)()); 
     void (*SoccerLevelsClass::function)(); 
     .... 

} 
#endif 


//MenuButton.cpp 
#include <MenuButton.h> 
Button::Button(void(*SoccerLevelsClass::func)()) 
{ 
    function=func;  //something like this 
} 

我知道代碼可能是失敗的,但我想知道是否有人有任何建議。 我真的很想知道的是,如果有可能的話。

+0

您是否正在使用C++ 11或第三方庫(如boost或Qt)?你想要做的是在'Button'類中放置一個'委託'對象,C++ 11具有'std :: function',boost有'boost :: bind'上下文(例如)你想要什麼。如果沒有,你可以做你在問什麼,但確實需要一些額外的工作 – txtechhelp

回答

0

是的,這可以通過函數指針來完成,就像在你的例子中一樣,如果你可以使用C++ 11,也可以用lambdas。

但是,既然你想調用另一個類的綁定函數,你需要傳遞/存儲指向該類的一個實例的指針,除非函數是靜態的。

+0

所以我需要傳遞對象和函數?因爲我想讓每個按鈕調用該類別的不同方法 – fuzymarshmello

+0

@fuzymarshmello是的,除非您調用的函數是靜態的。 –

0

在C++ 11,這是簡單的:

std::function<void(void)> _f; 

void apply() { 
    _f(); 
} 

Bar(void (Foo::* f)()) { 
    _f = std::bind(f, Foo()); 
} 

在C++ 03,這是有點棘手。注意在這兩個版本中我構建了一個臨時調用成員函數,但我不確定是否需要存儲該類的一個實例。

#include <iostream> 
#include <functional> 

struct Foo 
{ 
    Foo() { } 
    void stuff() { 
     std::cout << "hi\n"; 
    } 
}; 

struct Bar 
{ 
    void (Foo::* _f)(); 

    void apply() { 
     (Foo().*_f)(); 
    } 

    Bar(void (Foo::* f)()) { 
     _f = f; 
    } 
}; 

int main() 
{ 
    Bar bar(&Foo::stuff); 
    bar.apply(); 
} 
+0

這似乎是工作excpet我有一個問題傳遞th功能。這可能是因爲我的SoccerLevelsClass中有一個叫做按鈕的Button數組。鍵[0] =按鈕(這 - > loadLevel)());沒有工作? loadLevel是SoccerLevelsclass的void公共函數。 – fuzymarshmello

0

對於你正在嘗試做的,我會用觀察者模式:

class IFootballObserver 
{ 
public: 
    virtual void OnBallKicked() = 0; 
    virtual ~IFootballObserver() {} 
}; 

class Fooball 
{ 
public: 
    Fooball(IFootballObserver& obs) 
     : mObs(obs) 
    { 
     // Call the observer interface at any time like so: 
     mObs.OnBallKicked(); 
    } 
private: 
    IFootballObserver& mObs; 
}; 

class Button : public IFootballObserver 
{ 
public: 
    // Football could be passed in/owned by something else 
    Button() : mFootball(*this) { } 

    void DoSomething() 
    { 
    // Called when foot ball is kicked 
    } 
private: 
    virtual void OnBallKicked() 
    { 
     DoSomething(); 
    } 

Fooball mFootball; 
}; 

我覺得這是更容易比使用函數指針/的std ::功能。另外,你可以擁有一個觀察者矢量並通知許多事件對象。

相關問題