首先定义事件类型与回调函数签名,使用枚举和std::function封装;接着实现EventDispatcher类,通过map维护事件与回调列表的映射,提供on、off和emit方法;最后注册监听并触发事件,实现回调执行。示例中成功输出“Key E was pressed”,验证了机制正确性。
在C++中实现一个
简单的事件分发器,核心是建立一个能够注册回调函数、触发事件并调用对应处理逻辑的机制。这种基于回调的事件驱动模型广泛应用于GUI系统、网络编程和游戏开发中。下面介绍如何用标准C++实现一个轻量级但实用的事件分发器。
首先要确定事件的分类方式和回调函数的统一格式。通常使用枚举表示事件类型,用std::function封装回调函数,以便支持函数指针、lambda和可调用对象。
#include#include
这里用const void*传递事件数据,保持接口通用性。实际项目中可替换为具体事件类指针或智能指针。
EventDispatcher负责管理事件与回调之间的映射关系,支持添加监听、移除监听和派发事件。
class EventDispatcher {
private:
std::map> 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 %s\n",
event->key,
event->isPressed ? "pressed" : "released");
});
// 模拟触发事件
KeyEvent enter{ 'E', true };
dispatcher.emit(EventType::KeyPress, &enter);
return 0; }
输出结果为:Key E was pressed。这表明事件成功被分发并执行了回调函数。你可以继续添加更多类型的事件和监听器来扩展功能。
基本上就这些。这个模型不复杂但容易忽略细节,比如内存管理、异常安全和多线程访问。若需更高级特性,可引入信号槽机制(如Qt)或使用现代C++异步库进一步封装。
# c++
# go
# 回调函数
# ai
# 网络编程
# 游戏开发
# 键盘事件
# red
# qt
# 封装
# const
# void
# Lambda
# 指针
# 接口
# 线程
# 多线程
# map
# 并发
# function
# 对象
# 事件
# 异步
# 回调
# 移除
# 是一个
# 你可以
# 遍历
# 应用于
# 建立一个
# 如何用
相关文章:
如何选购建站域名与空间?自助平台全解析
如何用西部建站助手快速创建专业网站?
黑客如何通过漏洞一步步攻陷网站服务器?
香港网站服务器数量如何影响SEO优化效果?
教学网站制作软件,学习*后期制作的网站有哪些?
青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
建站OpenVZ教程与优化策略:配置指南与性能提升
PHP 500报错的快速解决方法
如何访问已购建站主机并解决登录问题?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何在自有机房高效搭建专业网站?
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
定制建站价位费用解析与套餐推荐全攻略
制作旅游网站html,怎样注册旅游网站?
常州企业建站如何选择最佳模板?
建站之星各版本价格是多少?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
定制建站如何定义?其核心优势是什么?
如何选择最佳自助建站系统?快速指南解析优劣
如何用狗爹虚拟主机快速搭建网站?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
如何在阿里云部署织梦网站?
Python多线程使用规范_线程安全解析【教程】
韩国服务器如何优化跨境访问实现高效连接?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
寿县云建站:智能SEO优化与多行业模板快速上线指南
在线教育网站制作平台,山西立德教育官网?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
开心动漫网站制作软件下载,十分开心动画为何停播?
建站之星安装模板失败:服务器环境不兼容?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
网站按钮制作软件,如何实现网页中按钮的自动点击?
建站之星安装后界面空白如何解决?
无锡营销型网站制作公司,无锡网选车牌流程?
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何用低价快速搭建高质量网站?
如何在香港免费服务器上快速搭建网站?
如何挑选最适合建站的高性能VPS主机?
如何在七牛云存储上搭建网站并设置自定义域名?
小型网站建站如何选择虚拟主机?
如何获取上海专业网站定制建站电话?
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
济南企业网站制作公司,济南社保单位网上缴费步骤?
C++时间戳转换成日期时间的步骤和示例代码
建站主机是否属于云主机类型?
魔方云NAT建站如何实现端口转发?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。