這裏是我的沒有那麼好的嘗試做這樣的工作: 首先你需要一個基本的事件處理程序類,那麼我們現在稱之爲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