这是我的情况:
我有一个事件驱动系统,其中我所有的处理程序都派生自 IHandler
类,并实现了一个 onEvent(const Event &event)
方法。现在,Event 是所有事件的基类,并且只包含枚举的事件类型。所有实际事件都派生自它,包括 EventKey
事件,它有 2 个字段:(uchar) keyCode
和 (bool) isDown
。
这是有趣的部分:我使用以下语法生成一个 EventKey
事件:
Event evt = EventKey(15, true);
然后我将它运送给处理人员:
EventDispatch::sendEvent(evt); // void EventDispatch::sendEvent(const Event &event);
(EventDispatch
包含 IHandlers
的链接列表,并使用包含已发送事件的参数调用它们的 onEvent(const Event &event)
方法。
现在是真正的问题:
假设我希望我的处理程序轮询 Event
类型队列中的事件,我该怎么做?
带有引用计数的动态指针听起来像是一个太大的解决方案。
制作拷贝比听起来更困难,因为我只接收到对基本类型的引用,因此每次我都需要检查事件类型,向上转换为
EventKey
然后制作拷贝以存储在队列中。听起来像是唯一的解决方案 - 但令人不快,因为我需要了解每一种类型的事件,并且必须针对收到的每个事件进行检查 - 听起来像是一个糟糕的计划。我可以动态分配事件,然后发送指向这些事件的指针,如果需要,将它们排入数组中 - 但除了引用计数之外 - 我如何能够跟踪该内存?您知道有什么方法可以实现不会干扰用户的非常轻的引用计数器吗?
您认为这个设计的好的解决方案是什么?
最佳答案
好吧,首先,这一行并没有像你想的那样:
Event evt = EventKey(15, true);
这会创建一个临时的 EventKey 对象,将其切片到基类 Event,然后调用 Event 复制构造函数。 EventKey 类中保存的所有实际数据都将丢失。如果你想要多态性,你想使用动态对象或引用。
至于您的实际问题,我建议您重新设计并为每种事件类型设置单独的队列(并因此设置单独的处理程序)...onEventA、onEventB 等。
关于C++ 存储变量和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947443/