社区讨论

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 { ... }
      • 需要实现 fireEventgetListenerType
      • 可以添加一些东西,例如说事件所需要的一些数据: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)
那么:
  1. 我的 getListenerType() 是不是没用了?
  2. 如果没用,我是否应当删除?(把 listener type 作为日志是否有意义?)
  3. 如果有用,我是应当调整我的 addEventListenerremoveEventListener,把原先传入的 eventType 变为 listenerType
  4. 当多个监听器需要监听多个事件的时候,有没有更优秀的实现方式?

CPP

回复

9 条回复,欢迎继续交流。

正在加载回复...