简介:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应
可能这些概念性的东西不是太好理解,通俗一点,回调函数就是在两个独立函数或者独立类通信的通道。
举个例子:
财务处是负责对公司财务状况和每个月的开销进行汇总
老板只会去看每个月的报表
那么在这个当中,老板不会去关心,财务整个汇总的过程,他只会去关心结果,那么,如果从面向对象的方法去理解的话,老板是一个对象.财务部是一个对象,当老板想看报表的时候,会跟财务打个招呼,等财务部汇总完了.然后将报表再去提交给老板,那么问题来了,而两个类之间实现通信的就是接口回调,从财务类的中,将结果回调到对象中.这种实现是通过接口自动完成的。
C++实现代码: 摘自:http://blog.csdn.net/qq_29924041
#include <iostream>
#include "finance.h"
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;
}
finance.h
#pragma once
#ifndef __FINANCE_H__
#define __FINANCE_H__
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