这里是我的没有那么好的尝试做这样的工作: 首先你需要一个基本的事件处理程序类,那么我们现在称之为EvtHandler:
class Event; //implement this yourself, it shall contain general but good info about event
class EvtHandler
{
public:
virtual void handleEvent (Event & evt);
};
然后每一个应该处理事件的方法类,应该从这个类派生,他们可以多,因为他们想,只要它们返回相同的数据类型实现新的功能(在这种情况下为)并且接收相同的参数(在这种情况下为事件)。就像这样:
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();
但是,再一次,这并不好,只是以为我会分享!对不起,一塌糊涂,哈哈!
尽一切努力避免void *。在C++中通常不需要它,它为更复杂的系统中的奇怪错误打开了可能性:它在没有编译器的帮助下强制发送者和接收者之间的一致性。 – stefaanv 2011-03-03 13:18:25