2016-07-13 70 views
0

我昨晚开始为我的游戏实现我的GUI系统,并决定尝试使用函数指针来处理gui事件。我之前没有使用它们,但能够获得基本的实现。但是,我想扩展GUI系统的可用性和“通用性”。目前,我在受保护的修饰符下的GUI超类中有一个函数指针。我还有一个getter(回调函数)和一个setter(subscribeEvent)来分配一个事件。目前,它看起来有点像这样:C++:如何将任何类的函数作为参数传递

class GUI 
{ 
public: 
    ……. 
    …… 
    std::function<void()> callback() const { return eventCallback; } 
    void subscribeEvent(const std::function<void()>& callback) 
    { 
     eventCallback = callback; 
    } 

protected: 
    std::function<void()> eventCallback; 
}; 

要设置一个回调函数,你在一个空函数subscribeEvent工作正常通过。然而,你不能在任何函数中使用范围解析修饰符,传入的函数必须是像这样的全局函数。

(MainGame.h): 

void global(); 

class MainGame 
{ 
public: 
    void Init(); 
    void nonGlobal(); 

private: 
    std::vector<GUI*> _guis; 
}; 

(MainGame.cpp): 

void MainGame::Init() 
{ 
    Button* button = new Button(……); //< Button is a subclass of GUI 
    button->subscribeEvent(global); //< This works fine 
    button->subscribeEvent(MainGame::nonGlobal); //< This does not work saying something like “void(MainGame) is not of type void()” 
    _guis.pushBack(button); 
} 

void MainGame::nonGlobal() 
{ 
…… 
} 

void global() 
{ 
…… 
} 

有谁知道如何修改参数,允许在任何类范围的任何功能中进行传递。这将是有益的,因为我可以有一个按钮事件来自玩家,敌人,项目,没有任何处理函数是全局的。我已经看到高级gui系统传递事件,如'event(handlerFunction,classtype)',所以你可以传入处理函数,然后传入一个处理函数驻留的对象。这是我想采用的一种方法。

+2

'button-> subscribeEvent([this](){nonGlobal();});' –

回答

1

,如果你做的功能MainGame::nonGlobal静态您的代码将工作:

class MainGame 
{ 
public: 
    void Init(); 
    static void nonGlobal(); 

private: 
    std::vector<GUI*> _guis; 
}; 

你不能传递一个非静态成员函数的原因是因为成员函数,在一个隐含的第一个参数(this)您的案例的类型MainGame*。所以实际上你目前试图通过的函数有签名void(MainGame*)而不是void()

或者,您也可以直接使用Lambda而不是传递函数this参数绑定:

button->subscribeEvent([this](){nonGlobal();}); 
0

更改此:

button->subscribeEvent(MainGame::nonGlobal); //< This does not work saying something like “void(MainGame) is not of type void()” 

button->subscribeEvent(std::bind(&MainGame::nonGlobal, this)); 

有了这个改变你有的终身管理的另一个问题虽然。

+0

非常感谢!我继续在subscribeEvent函数中实现了std :: bind功能,因此我可以在MainGame代码中调用&MainGame :: nonGlobal而不使用std :: bind。我也使它通用,所以我可以包含带参数的函数:std :: function callback()const {return eventCallback; } \t模板 \t空隙subscribeEvent(T实例,F FUNC,参数数量...参数) \t { \t \t呼叫临时= {标准::绑定(FUNC ,instance,args ...)}; \t \t eventCallback = temp; \t} – Connor

相关问题