问题描述
我目前正在尝试用 C++ 编写一个事件系统。问题很具体,很抱歉长时间阅读...
什么有效?
Events
看起来像这样:
class IEvent { //interface stuff };
class EventA : public IEvent { // A implementation };
class EventB : public IEvent { // B implementation };
现在所有应接收和处理事件的对象都基于 EventHandler
接口:
class IEventHandler
{
public:
virtual void eventCallback(IEvent*) = 0;
};
// Example implementation
class HandlerImplementation : public IEventHandler
{
public:
// Overloads for several events (different for each implementation of the handler interface)
virtual void eventCallback(EventA*) { cout << "This is an A event." << endl; }
virtual void eventCallback(EventB*) { cout << "This is a B event." << endl; }
// "Fallback"
virtual void eventCallback(IEvent*) override { cout << "Some other event..." << endl; }
};
这按预期工作。在我的 EventHandler
接口上构建的每个类都会为每个 Event
类型(或默认函数)调用适当的回调函数:
int main()
{
class EventC : public IEvent {};
EventA a;
EventB b;
EventC c;
HandlerImplementation handler;
handler.eventCallback(&a); // This is an A event.
handler.eventCallback(&b); // This is a B event.
handler.eventCallback(&c); // Some other event...
}
什么不起作用?
事件不应该总是在发生时处理。处理程序可能想要缓冲它们,以便可以安排处理。
我尝试像这样扩展 EventHandler
接口:
class IEventHandler
{
public:
virtual void eventCallback(IEvent*) = 0;
private:
std::priority_queue<IEvent*> event_queue;
};
然而,存储在此队列中的 IEvent
指针当然只会触发“默认”回调,而不会触发任何重载。
有什么方法可以“记住”哪些 Event
类型已向上转换为 IEvent*
或者您是否知道可以完全避免这种情况的任何模式?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)