我昨晚开始为我的游戏实现我的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)',所以你可以传入处理函数,然后传入一个处理函数驻留的对象。这是我想采用的一种方法。
'button-> subscribeEvent([this](){nonGlobal();});' –