回调函数
所谓的回调函数是指:按照一定的形式由开发人员定义并编写实现内容。使用回调函数,实际上就是在调用某个函数(通常是API函数)时,将自己的一个函数(也就是回调函数)的地址作为参数传递给那个函数。而那个函数在需要的时候,也就是某种事情发生的时候,利用传递的函数地址调用回调函数,这时开发人员可以利用这个机会在回调函数中处理消息或完成一定的操作。回调函数只能是全局函数,或者是静态函数,因为这个函数只是在类中使用,所以为了维护类的完整性,我们用类的静态成员函数来做回调函数。
使用回调要完成以下工作:
1、获取函数地址:
获取函数地址很简单:只要使用函数名即可。比如test()是一个函数,则test就是该函数的地址。要将函数作为参数传递,只需要传递函数名即可。
2、声明一个函数指针:
声明一个函数指针,必须指定指针指向的函数类型,也就是声明应指定函数的返回类型以及函数的参数列表。如:
double cam(int);//函数原型
double (*fp)(int);//指针类型声明
因为cam为函数,所以(*fp)也为函数,所以,fp为函数指针
注:要声明指向特定类型的函数的指针,可以首先编写这种函数的原型,然后用(*fp)替换函数名,这样fp就是这类函数的指针。注意(*fp)必须用括号括起来。因为:
*fp(int)==>fp是一个返回指针的函数
(*fp)(int)==>fp是一个指向函数的指针
声明之后便可将相应函数的地址赋给它。如下所示:cam()的参数及返回类型必须与fp相同。
double cam(int);
double (*fp)(int);
fp=cam;
调用函数原型:
void test(int n,double(*fp)(int));第二个参数是一个函数指针,它指向的函数接受一个int参数,并返回一个double值。要让test使用cam()函数,则需将cam()的地址传给它,即:test(3,cam);
3、使用函数指针来调用函数
double cam(int);
double (*fp)(int);
fp=cam;
double x=cam(4);//使用函数名调用cam()
double y=(*fp)(5);//使用指针fp调用cam()
c++也允许像使用函数名那样使用fp:double y=fp(5);不过第一种方式更能显示出正在使用函数指针。
回调有两个主要缺点:1> 它们不是类型安全的。我们从来都不能确定处理函数使用了正确的参数来调用回调。2> 回调和处理函数是非常强有力的联系在一起的,因为处理函数必须要知道调用哪个回调。
- 无匹配