当前位置: 首页 > news >正文

C/C++|回调函数的正确打开方式

最近在学习muduo库,其中的回调给我弄得晕头转向,后来才发现主要是回调函数的使用逻辑还没摸清楚,所以这里用一个简单的案例,来探究他们都是如何使用回调函数的。

一般回调函数都是用在类中:

我们将创建一个 EventHandler 类,用于处理事件,并允许用户设置自定义的回调函数。当事件发生时,EventHandler 会调用用户设置的回调函数。

#include <iostream>
#include <functional>class EventHandler {
public:using Callback = std::function<void(int)>;//设置回调函数void setCallback(Callback cb) {callback_ = std::move(cb);}//触发事件并调用回调函数void triggerEvent(int eventCode) {if (callback_) {callback_(EventCode);}}
private:Callback callback_;
};

在这个定义中:

  • EventHandler 类中有一个 Callback 类型定义,它是一个 std::function<void(int)> 类型,用于保存回调函数。
  • setCallback 方法允许用户设置自定义的回调函数。
  • triggerEvent 方法在事件发生时调用回调函数。

1. 实现自定义回调函数并设置到类中

void myCallbackFunction(int eventCode) {std::cout << "Event triggered with code: " << eventCode << std::endl;
}int main() {EventHandler handler;// 设置自定义回调函数handler.setCallback(myCallbackFunction);// 触发事件,调用回调函数handler.triggerEvent(42);  // 输出:Event triggered with code: 42return 0;
}

2. 使用lambda表达式作为回调

int main() {EventHandler handler;// 设置 lambda 表达式作为回调函数handler.setCallback([](int eventCode) {std::cout << "Lambda: Event triggered with code: " << eventCode << std::endl;});// 触发事件,调用回调函数handler.triggerEvent(99);  // 输出:Lambda: Event triggered with code: 99return 0;
}

在muduo网络库中,大量的类都有回调函数,所以我们有一个一定要搞清楚,那就是:该回调函数属于哪个类?该回调的触发事件是什么?谁在给他设置回调函数,是用户?还是别的类?

相关文章:

  • go-gin中session实现redis前缀和db库选择+单点登录
  • 攻防实战 | 邮件高级威胁检测与自动化响应
  • 【原创】springboot+mysql医院预约挂号管理系统设计与实现
  • EXCEL数据透视图中的日期字段,怎样自动分出年、季度、月的功能?
  • 匠心独运,B 端系统 UI 演绎华章之美
  • springboot 的yaml配置文件加密
  • React 为什么使用map来渲染列表 而不是其他循环方法
  • Docker 的基本概念和优势
  • 遗传算法(GA)
  • Python怎么使用 SQLAlchemy 和model 查询数据呢?
  • SpringCloud如何实现SSO单点登录?
  • 计算机网络期末复习(1)计算机网络在信息时代对的作用 计算机网络的定义和分类 三种交换方法
  • STM32学习问题总结(2)—CubeMX生成项目后串口没效果和Microlib
  • Java Apache Jaccard文本相似度匹配初体验
  • Linux下Git的基本使用
  • 0基础学习移动端适配
  • AWS实战 - 利用IAM对S3做访问控制
  • Bytom交易说明(账户管理模式)
  • JAVA 学习IO流
  • MySQL用户中的%到底包不包括localhost?
  • Redis在Web项目中的应用与实践
  • Swoft 源码剖析 - 代码自动更新机制
  • 关于Flux,Vuex,Redux的思考
  • 老板让我十分钟上手nx-admin
  • 入手阿里云新服务器的部署NODE
  • zabbix3.2监控linux磁盘IO
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #职场发展#其他
  • (3)STL算法之搜索
  • (33)STM32——485实验笔记
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (汇总)os模块以及shutil模块对文件的操作
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)Google的Objective-C编码规范
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .equals()到底是什么意思?
  • .form文件_SSM框架文件上传篇
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET IoC 容器(三)Autofac
  • .net 按比例显示图片的缩略图
  • .NET 反射 Reflect
  • .net分布式压力测试工具(Beetle.DT)
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • .Net下的签名与混淆
  • .NET正则基础之——正则委托
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @开发者,一文搞懂什么是 C# 计时器!
  • [20170705]diff比较执行结果的内容.txt
  • [4.9福建四校联考]
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作