C++ 中回调函数详解及简单实例
什么是回调函数
在C++中,回调函数是一种以函数指针的形式实现的编程技巧。简而言之,回调函数就是一种通过在函数参数中传递函数指针的形式,来实现在需要时调用这个函数的一种方式。
回调函数的用途
回调函数最常见的使用场景是在异步和事件驱动编程中,当一个事件触发时,需要某个函数处理该事件。由于该事件的触发时间不确定,因此需要把该函数以函数指针的形式传递给事件处理程序,待事件触发时调用该函数。
回调函数的实现
回调函数需要在函数定义时设置一个函数指针类型的参数,以传递该函数的指针。例如:
void function(int arg1, int arg1, void (*callback)(int));
上述函数定义中,callback 参数即为函数指针类型回调函数。可以看出,回调函数参数的类型是 void(*)函数类型,这是一个函数指针,指向某个函数。
实现回调函数的方法很简单:
- 定义回调函数,命名并实现需要通过回调函数执行的操作。
- 在需要时,在函数调用时将回调函数的地址传递给要调用的函数。
回调函数的简单实现
下面通过两个简单的示例来演示如何实现回调函数。
示例一:计算器
- 需求:一个计算器计算两个数的和,并且可以增加多个回调函数,在计算完成后执行。
#include<iostream>
using namespace std;
typedef void(*CallbackFunc)(int); // 定义函数指针类型,用于传递回调函数
void Add(int a, int b, CallbackFunc callback) // 回调函数作为传入参数
{
int sum = a + b;
callback(sum); // 计算完成后执行回调函数
}
void PrintResult(int sum) // 回调函数的定义
{
cout << "The sum is " << sum << endl;
}
int main()
{
Add(1, 2, PrintResult); // 调用计算函数,并将回调函数 PrintResult 传入
return 0;
}
运行结果:
The sum is 3
示例二:模拟事件处理
- 需求:模拟一个异步处理队列,在处理完成时触发回调函数。
#include<iostream>
#include<queue>
using namespace std;
typedef void(*CallbackFunc)(); // 定义函数指针类型,用于传递回调函数
class AsyncQueue // 异步处理队列
{
public:
void AddTask(CallbackFunc callback) // 添加任务函数
{
queue_.push(callback); // 将回调函数加入队列
}
void Process() // 处理队列函数
{
while(!queue_.empty())
{
auto callback = queue_.front(); // 取出队列中的回调函数
queue_.pop();
callback(); // 执行回调函数
}
}
private:
queue<CallbackFunc> queue_; // 回调函数队列
};
void Task1()
{
cout << "Task1 completed." << endl;
}
void Task2()
{
cout << "Task2 completed." << endl;
}
int main()
{
AsyncQueue queue;
queue.AddTask(Task1); // 添加新的回调函数
queue.AddTask(Task2); // 添加新的回调函数
queue.Process(); // 处理队列中的所有回调函数
return 0;
}
运行结果:
Task1 completed.
Task2 completed.
从上面两个示例可以看到,回调函数的使用可以方便地在不同的模块之间传递数据和信息,并且降低了模块与模块之间的耦合性。同时,也提高了代码的灵活性和可扩展性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 中回调函数详解及简单实例 - Python技术站