私は昨夜私のゲームのGUIシステムを実装し始めました。私はGUIポインタを使ってGUIイベントを処理しようとしました。私は前にそれらを使用していませんでしたが、基本的な実装を得ることができました。しかし、GUIシステムの使いやすさと汎用性を広げたいと思います。現在、私は保護された修飾子の下でGUIスーパークラスに関数ポインタを持っています。また、geti(コールバック)と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にvoid関数に渡し、関数コールバックを設定するには:それは、現在、このような小さなものになります。しかし、どのような関数でもスコープ解決修飾子を使うことはできません。渡される関数はグローバル関数でなければなりません。
(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();}); ' –