回调函数(callback)
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
可能这些概念性的东西不是太好理解,通俗一点,回调函数就是在两个独立函数或者独立类通信的通道
#ifndef __FINANCE_H__ #define __FINANCE_H__ #include<iostream> namespace zzf{ #include<iostream> using namespace::std; /* * *定义一个callback的接口 * */ class CallBack{ public: virtual void setFinanceResult(int result) const = 0; }; /* * *财务: 专门用于计算结果的 * */ class Finance{ public: Finance(CallBack* mCallBack2) :mCallBack(mCallBack2){ cout << "finance constructor" << endl; } ~Finance(){ cout << "finance destructor" << endl; } void caculateFinance(int * a, int n){ int result = 0; for (int i = 0; i < n; i++){ result += *(a + i); } if (mCallBack != NULL){ cout << "result:" << result << endl; mCallBack->setFinanceResult(result); } } private: CallBack* mCallBack; }; /* * *老板,实现接口callback * */ class Boss :public CallBack{ public: Boss(){ //将接口实例化后,传递给Finance mFinace = new Finance(this); cout << "boss constructor" << endl; } ~Boss(){ delete mFinace; cout << "boss destructor" << endl; } //查看财务的函数 void readFianace(int *array, int n){ cout << "boss readFianace" << endl; mFinace->caculateFinance(array, n); } //实现后的回调函数,这个函数就是用来接收回调的值的 void setFinanceResult(int result) const{ cout << "caculate result:" << result << endl; } private: Finance *mFinace; }; } #endif using namespace::std; using namespace::zzf; int main(int argc, char *argv[]){ int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; Boss boss; boss.readFianace(array, 10); return 0; }
其实这个案例能够让我们对回调有更加深刻的认识:
1:老板想查看财务(调用自己函数,函数在boss内)
2:通知财务,我要查看报表(进行计算的过程,函数在finance内部)
3:财务算好之后,返回给老板(回调的函数在boss内部)
也就是回调就是把不需要自己处理的东西放到别的类去,然后等其处理完毕之后,再返回给调用的类.
总结:
回调四步曲:
定义一个回调接口
调用类去实现这个接口,重写方法
被调用者将接口做为参数传递进去,并且在某个时刻进行出发
调用者在调用的时候去实例化这个回调接口(如上述案例中因为已经实现了接口,所以将类本身对应的对象作为参数传递进去)