首先定义事件类型与回调函数签名,使用枚举和std::function封装;接着实现EventDispatcher类,通过map维护事件与回调列表的映射,提供on、off和emit方法;最后注册监听并触发事件,实现回调执行。示例中成功输出“Key E was pressed”,验证了机制正确性。

在C++中实现一个简单的事件分发器,核心是建立一个能够注册回调函数、触发事件并调用对应处理逻辑的机制。这种基于回调的事件驱动模型广泛应用于GUI系统、网络编程和游戏开发中。下面介绍如何用标准C++实现一个轻量级但实用的事件分发器。
定义事件类型与回调签名
首先要确定事件的分类方式和回调函数的统一格式。通常使用枚举表示事件类型,用std::function封装回调函数,以便支持函数指针、lambda和可调用对象。
#include #include
这里用const void*传递事件数据,保持接口通用性。实际项目中可替换为具体事件类指针或智能指针。
实现事件分发器类
EventDispatcher负责管理事件与回调之间的映射关系,支持添加监听、移除监听和派发事件。
立即学习“C++免费学习笔记(深入)”;
class EventDispatcher {private: std::map<EventType, std::vector> listeners;public:// 注册事件回调void on(EventType type, const EventCallback& callback) {listeners[type].push_back(callback);}
// 移除某个事件的所有回调void off(EventType type) { listeners.erase(type);}// 触发事件,通知所有监听者void emit(EventType type, const void* data = nullptr) { auto it = listeners.find(type); if (it != listeners.end()) { for (const auto& cb : it->second) { cb(data); } }}
};
每个事件类型对应一个回调函数列表,emit时遍历执行。注意避免在回调中修改监听器集合,否则可能引发迭代器失效。生产环境可加入线程安全控制或延迟删除机制。
使用示例:模拟按键事件
下面是一个简单应用场景:注册键盘事件监听,并发送测试事件。
struct KeyEvent { char key; bool isPressed;};int main() {EventDispatcher dispatcher;
// 注册按键事件回调dispatcher.on(EventType::KeyPress, [](const void* data) { const KeyEvent* event = static_cast(data); printf("Key %c was %sn", event->key, event->isPressed ? "pressed" : "released");});// 模拟触发事件KeyEvent enter{ 'E', true };dispatcher.emit(EventType::KeyPress, &enter);return 0;
}
输出结果为:Key E was pressed。这表明事件成功被分发并执行了回调函数。你可以继续添加更多类型的事件和监听器来扩展功能。
基本上就这些。这个模型不复杂但容易忽略细节,比如内存管理、异常安全和多线程访问。若需更高级特性,可引入信号槽机制(如Qt)或使用现代C++异步库进一步封装。
以上就是C++如何实现一个简单的事件分发器_C++实现基于回调的事件驱动模型的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1489671.html
微信扫一扫
支付宝扫一扫