社区讨论
C++ EventListener 实现求助
学术版参与者 4已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @m2bgr1f8
- 此快照首次捕获于
- 2024/10/16 14:00 去年
- 此快照最后确认于
- 2025/11/04 17:05 4 个月前
现声明以下内容;
- 事件(Event),是一个抽象基类(接口),有两个方法实现:
virtual void fireEvent(),执行这个事件;virtual std::type_index getListenerType(),返回监听这个事件的监听器类;
- 事件监听器(Event Listener),也是一个抽象基类(接口),只有一个虚析构函数
virtual ~EventListener() = default;。
部分实现:
- 自定义事件和监听器
- 使用
class myListener : public EventListener { ... }来自定义一个监听器;- 其中内部要声明一个虚函数,代表「当事件触发时做的事」,会提供给派生类,如
virtual void onInput(int inputNumber) = 0;;
- 其中内部要声明一个虚函数,代表「当事件触发时做的事」,会提供给派生类,如
- 使用
class myEvent : public Event<myListener> { ... }来自定义一个事件;- 内部方法使用重写,如
std::type_index getListenerType() override { ... }。 - 需要实现
fireEvent和getListenerType; - 可以添加一些东西,例如说事件所需要的一些数据:
class myEvent : public Event<myListener> { public: int myNumber; ...... };;
- 内部方法使用重写,如
- 自定义的事件和监听器一般会放在一起在一个命名空间里。
- 使用
- 订阅指定事件给指定事件监听器:
eventManager.addEventListener(std::type_index(typeid(myEvent)), myListener);,其中eventManager是类EventManager的实例,该类中实现了订阅事件、取消订阅和触发事件;
当我接收到了一个消息的时候,我需要把这个消息传递给任意个数个「事件监听器」,这个方法是应该可以用的。
但是,我在订阅事件的时候,在
listenersMap 里存入了 eventType : eventListener 的键值对;在
fireEvent 的时候,因为我没有办法使用类似于 listenersMap.get(listenerType) 的东西来获取所有符合类型为 listenerType 的 EventListeners,我只能使用 listenerMap.find(eventType);那么:
- 我的
getListenerType()是不是没用了? - 如果没用,我是否应当删除?(把 listener type 作为日志是否有意义?)
- 如果有用,我是应当调整我的
addEventListener和removeEventListener,把原先传入的eventType变为listenerType? - 当多个监听器需要监听多个事件的时候,有没有更优秀的实现方式?
CPP
代码实现:洛谷云剪贴板 aqfanzl2
回复
共 9 条回复,欢迎继续交流。
正在加载回复...