Я начал внедрять свою систему GUI для своей игры прошлой ночью, и я решил попробовать использовать указатели функций для обработки событий gui. Я не использовал их раньше, но смог получить базовую реализацию. Однако я хочу расширить удобство и «универсальность» системы GUI. В настоящее время у меня есть указатель на функцию в суперклассе GUI под защищенным модификатором. У меня также есть getter (callback) и setter (subscribeEvent) в классе, чтобы назначить gui событие. В настоящее время она выглядит немного что-то вроде этого: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();});' –