C++ 存储变量和继承

标签 c++ inheritance memory-management event-handling polling

这是我的情况:

我有一个事件驱动系统,其中我所有的处理程序都派生自 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/

相关文章:

inheritance - 我真的不明白这个co/contravariance的事情...我不能同时拥有通用的get和set方法吗?

c++ - 在多线程应用程序中减慢与 vector::push_back 和 placement new 相关联

objective-c - 发送到解除分配实例的消息...在@synthesize 期间发送?

C++ 检查列表是否包含子列表

c++ - 指向派生类的基指针

c++ - 两次移动智能指针与复制

c++ - 子类成员变量作为初始化列表中主类构造函数的参数=崩溃?

c - 中止陷阱 6 和文本文件输出

c++ - 派生类的 friend 重载运算符和基成员访问

C++ , 1 cin 输入数组的所有内容