回调函数是通过函数指针调用的函数:把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就称为回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
通俗点说就是:在A类中调用B类中的某个方法C,然后B类反过来调用A类中的方法D,则D就是回调函数。
打个比方:
我们将A类看成一个人,就叫他小A;将B类也看成一个人,就叫他小B;
那么使用回调函数D的过程就可以这样理解:
小A在开发过程中遇到了一个麻烦,而这个麻烦只有小B才能解决,于是小A找到了小B求他帮忙,但是由于和小B不怎么熟悉于是带上了名片。小A向小B说明了遇到的麻烦后,正巧小B正在忙于其他事情,于是小B先收下了小A的名片,告诉小A回去等消息。由于这个麻烦不解决就无法继续开发,于是回去等消息的小A就只好先去做别的事情。过了一段时间小B忙完手上的事情,解决了小A的麻烦后,找出小A名片上的电话号码拨了过去,告诉小A,麻烦已经搞定了(小B只是顺着名片把解决方案告诉给小A,而并不关心自己给出的解决方案在小A那里会如何运用)。小A放下电话后,利用小B给他的解决方案继续开发。
简而言之:小A带着名片D通过途径C找到小B求他帮忙,小B不能立即解决于是收下名片D,之后的某天小B解决了小A的问题后又通过名片D告诉了小A解决方法。
即:
A类调用B类中的C方法,D作为函数指针当做C方法的一个参数(小A带着名片D通过途径C找到小B求他帮忙)
B类无法立即处理,就先进行回调函数标记(收下名片)
在未来的某一个时间点,当满足触发条件时(解决问题后)
通过回调函数D传递回信息给A类(通过名片告诉结果)
下面以一个例子说明上述过程(解释见注释):
#include <iostream>
typedef void (*Fun)(int);//定义一个函数指针类型
Fun p = NULL;//用Fun定义一个变量p,它指向一个返回值为空参数为int的函数
void caller(Fun pCallback)
{
p = pCallback;
//达成某一条件后,通过名片(函数指针p),传回结果
int result = 1;
(*p)(result);
}
void callback(int a)//回调函数
{
std::cout << "callback result = " << a << std::endl;
}
int main(int argc, char* argv[])
{
caller(callback);
getchar();
return 0;
}