Вот моя не очень удачная попытка выполнить подобную работу: прежде всего вам нужен базовый класс обработчика событий, давайте пока назовем его EvtHandler:
class Event; //implement this yourself, it shall contain general but good info about event
class EvtHandler
{
public:
virtual void handleEvent (Event & evt);
};
Затем каждый класс, который должен каким-то образом обрабатывать события, должен быть производным от этого класса, и они могут реализовывать новые функции столько раз, сколько захотят, если они возвращают один и тот же тип данных ( void в данном случае) и получить те же параметры (в данном случае Event). Нравится:
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;
};
Затем вы можете зарегистрировать свои EvtHandler, например, в этом конкретном центре сообщений!
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 ();
Но опять же, это совсем не хорошо, просто решил поделиться! Извините за беспорядок, ха-ха!
person
Parsa Jamshidi
schedule
03.03.2011