最近在学习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: 42
return 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: 99
return 0;
}
在muduo网络库中,大量的类都有回调函数,所以我们有一个一定要搞清楚,那就是:该回调函数属于哪个类?该回调的触发事件是什么?谁在给他设置回调函数,是用户?还是别的类?