回调函数(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内部)
也就是回调就是把不需要自己处理的东西放到别的类去,然后等其处理完毕之后,再返回给调用的类.

总结:
回调四步曲:

定义一个回调接口
调用类去实现这个接口,重写方法
被调用者将接口做为参数传递进去,并且在某个时刻进行出发
调用者在调用的时候去实例化这个回调接口(如上述案例中因为已经实现了接口,所以将类本身对应的对象作为参数传递进去)

 

posted @ 2022-03-09 23:35  小丑_jk  阅读(396)  评论(0编辑  收藏  举报