天天看点

CallBack 回调函数

回调函数的定义:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

我自己的通俗理解:老鲍要盖一栋房子(相当于一个函数方法),打地基-》垒墙-》....,要上顶了,他自己不想去上或者不知道怎么上(方法到这暂停),但他知道我会上,因为盖房子之前有人已经把我会上房顶这事告诉他了,要不然他不会盖房子的,函数功能就应该达到某个功能(相当于调用的时候把回调函数的指针传给了他),于是经理一个电话,我就把房顶上上了,然后没我事了,经理继续把家给装修了一下,工作完成。

这里“我”就是回调函数,老鲍是回调函数的调用函数

 为什么要使用回调函数?

  因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

  如果想知道回调函数在实际中有什么作用,先假设有这样一种情况,我们要编写一个库,它提供了某些排序算法的实现,如冒泡排序、快速排序、shell排序、shake排序等等,但为使库更加通用,不想在函数中嵌入排序逻辑,而让使用者来实现相应的逻辑;或者,想让库可用于多种数据类型(int、float、string),此时,该怎么办呢?可以使用函数指针,并进行回调。

  回调可用于通知机制,例如,有时要在程序中设置一个计时器,每到一定时间,程序会得到相应的通知,但通知机制的实现者对我们的程序一无所知。而此时,就需有一个特定原型的函数指针,用这个指针来进行回调,来通知我们的程序事件已经发生。实际上,SetTimer() API使用了一个回调函数来通知计时器,而且,万一没有提供回调函数,它还会把一个消息发往程序的消息队列。

  另一个使用回调机制的API函数是EnumWindow(),它枚举屏幕上所有的顶层窗口,为每个窗口调用一个程序提供的函数,并传递窗口的处理程序。如果被调用者返回一个值,就继续进行迭代,否则,退出。EnumWindow()并不关心被调用者在何处,也不关心被调用者用它传递的处理程序做了什么,它只关心返回值,因为基于返回值,它将继续执行或退出。

  不管怎么说,回调函数是继续自C语言的,因而,在C++中,应只在与C代码建立接口,或与已有的回调接口打交道时,才使用回调函数。除了上述情况,在C++中应使用虚拟方法或函数符(functor),而不是回调函数。

回调函数的应用举例:

 1 typedef int (*callback)(int param1, char* param2);定义函数指针

 2 

 3 Syntax(句法规则)

 4     typedef return_code  (*function_virtual_name)(parameters list);

 5 

 6 Example

 7 class CCall;

 8 typedef int (*callback)(CCall* call, int i);

 9 class CCall{

10 public:

11     CCall(int i = 0)

12         : _i(i)

13     {};

14     virtual ~CCall() {}

15     

16     int becall(int i) { return call(i); }

17     virtual int call(int i) = 0;

18 private:

19     int _i;

20 };

21 

22 static int Func(CCall* call, int i)//call 为回调函数的指针

23 {

24     return call->becall(i);

25 }

26 

未完成。。。。。。

继续阅读