C++回调函数小结
来源:互联网 发布:周立功单片机官网 编辑:程序博客网 时间:2024/05/13 19:57
引言
之前在项目中使用winpcap遇到过回调函数,但当时是使用非回调方法实现的数据捕获,并未深究回调方法,如今项目中又遇到,特回来填坑。。
定义
回调,说白了就是函数指针的一种用法。
1.函数指针
函数指针是指向函数的指针变量。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。例如:
bool lengthCompare(const string &, const string &);
该函数的类型是bool (const string &, const string &)
想要声明一个可以指向该函数的指针,只需用指针替换函数名即可:
bool (*pf)(const string &, const string &)//*pf两端的括号不可少pf=lengthCompare; //等价于pf=&lengthCompare;&符号可选bool b1=pf("hello", "goodbye"); //调用lengthCompare函数bool b2=(*pf)("hello", "goodbye"); //一个等价的调用bool b3=lengthCompare("hello", "goodbye"); //另一个等价的调用
C++在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,就可以用该指针变量调用函数了。
2.typedef函数指针
往往利用typedef来简化使用函数指针时的声明和定义操作。
型式:typedef 返回类型(*新类型)(参数表)
typedef bool (*pfType)(const string &, const string &); //定义新的函数指针类型pfType pf; //使用新函数指针类型定义了变量pfbool lengthCompare(const string &a, const string &b) //函数实现{ /*do something*/}void main(){ pf = lengthCompare; bool b2 = (*pf)("hello", "goodbye");}
3.回调函数
回调函数就是一个通过函数指针调用的函数。如果你把函数a的指针(地址)作为参数传递给另一个函数b,当这个指针被用来调用其所指向的函数a时,我们就说函数a是回调函数。回调函数不是由该函数的实现方(模块A)直接调用,而是在特定的事件或条件发生时由另外的一方(模块B)调用的,用于对该事件或条件进行响应。
即:模块A要通过模块B的某个(接口)函数b()完成一定的功能,但是函数b()自己无法实现全部功能,需要反过头来调用模块A中的某个函数a()来完成,这个a()就是回调函数。
使用步骤
1. 定义一个回调函数;
包括定义回调函数a()的函数原型(声明),也就是约定模块B中的接口规范;实现具体回调函数a()。
2. 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者;
包括函数b()的声明和实现。
3. 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。
运行时,函数b()中调用具体的函数a()
例子
#include <iostream>using namespace std;typedef int (*FP_CALC)(int,int); //步骤1.1:定义一个函数指针类型,即定义回调函数a()的函数原型//步骤1.2:实现各种回调函数,函数的参数必须与回调函数原型的参数保持一致int myadd(int a, int b) { return a + b;}int mysub(int a, int b){ return a - b;}int mymul(int a, int b){ return a * b;}int mydiv(int a, int b){ return b? a/b : -1;}//被调函数int GetCallBack(FP_CALC callback, int a, int b) //步骤2:将回调函数的函数指针注册给调用者{ return callback(a,b);}int main(){ double a=100,b=20; cout<<"a+b="<<GetCallBack(myadd, a, b)<<endl;//步骤3:调用具体的回调函数 cout<<"a-b="<<GetCallBack(mysub, a, b)<<endl;//依据不同条件调用不同的回调函数 cout<<"a*b="<<GetCallBack(mymul, a, b)<<endl; cout<<"a/b="<<GetCallBack(mydiv, a, b)<<endl; return 0;}
输出
a+b=120a-b=80a*b=2000a/b=5
注意
- 回调函数可以象普通函数一样被程序调用,但是只有它被当作参数传递给被调函数时才能称作回调函数。
- 如果赋了不同的值给该参数,那么调用者将调用不同地址的函数。赋值可以发生在运行时,这样使你能实现动态绑定。
参考
typedef函数指针用法
回调函数的那些事儿
异步消息的传递-回调机制
0 0
- 回调函数小结
- Lua回调函数小结
- Lua回调函数小结
- 回调函数的小结
- GLUT 回调函数小结
- Lua回调函数小结
- C++回调函数小结
- C 回调函数
- 【c++】回调函数
- C 回调函数
- C回调函数
- [C] 回调函数
- C 回调函数
- C回调函数
- [C++]回调函数
- c/c++:回调函数
- C /C ++ 回调函数
- 理解C回调函数
- es5--js实现对象注册
- 将博客搬至CSDN
- 【Zynq学习笔记1】入手资料合集
- java中静态代码块的用法 static用法详解
- hdu2955 概率dp
- C++回调函数小结
- ORACLE用户管理
- 如何写好简历
- BCD(Binary-Coded Decimal)
- 深入PHP面向对象、模式与实践——高级特性(3)
- canvas封闭图形填充与
- 鸟哥的linux私房菜学习笔记《三十三》逻辑卷管理
- 欢迎使用CSDN-markdown编辑器
- Java并发编程艺术----读书笔记(一)