Вот моя не очень хорошая попытка сделать такую работу:
Прежде всего, вам нужен базовый класс обработчика событий, ну, давайте теперь назовем его 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;
};
Тогда вы можете зарегистрировать свои 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 ();
Но опять же, это совсем нехорошо, просто подумал, что поделюсь! Извините за беспорядок, ха-ха!