これは、そのような仕事をするための私のあまり良い試みではありません: まず第一に、基本イベント ハンドラー クラスが必要です。今のところ、それを EvtHandler と呼びましょう:
class Event; //implement this yourself, it shall contain general but good info about event
class EvtHandler
{
public:
virtual void handleEvent (Event & evt);
};
次に、何らかの方法でイベントを処理することになっているすべてのクラスは、このクラスから派生する必要があり、同じデータ型 (この場合はvoid )を返し、同じパラメーターを受け取る限り、必要なだけ新しい関数を実装できます。 (この場合のイベント)。このような:
class Foo : public EvtHandler
{
public:
void handleFooEvent (Event & event);
};
次に、特別なイベントごとにメッセージ センターを実装しました。これは、リスナーを登録し、必要に応じてイベントをディスパッチする必要がありました。
class ShutdownMessageCenter
{
typedef std::map<EventHandler *, event_func> ListenerMap;
public:
void register (EvtHandler * handler, void(EvtHandler::*memFunc)(Event &)) {
m_lmap[handler] = memFunc;
}
void callListeners () {
Event shutdown_event (EM_SHUTDOWN /*just imagine this can mean something, idk*/);
ListenerMap::iterator itr = m_lmap.begin ();
for (; itr != m_lmap.end(); ++itr) {
EvtHandler * handler = itr->first;
void (EvtHandler::*func)(Event &) = itr->second;
(handler->*func)(shutdown_event);
}
}
private:
ListenerMap m_lmap;
};
次に、たとえば、EvtHandlers をこの特定のメッセージ センターに登録できます。
ShutdownMessageCenter message_center;
EvtHandler * some_handler = new EvtHandler ();
Foo * some_foo = new Foo ();
message_center.register (some_handler, &EvtHandler::handleEvent);
message_center.register (some_foo, static_cast<void (EvtHandler::*)(Event &)>(&Foo::handleFooEvent);
message_center.callListeners ();
しかし、もう一度言いますが、これはまったく良くないので、共有したいと思いました! 混乱してすみません、ハハ!