初识回调函数

目前的初步理解:使用回调函数的过程是将要调用的函数作为参数传递给上层函数,上层函数可以使用同样的调用方法来调用不同的回调函数,这样做有利于封装,可以将数据项与函数分离开,常用于网络通信中,下面直接上代码吧,以后有了更深刻的认识再做详细记录

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

class PARAM
{
public:
    int num1;
    int num2;

public:
    PARAM(int n1, int n2)
    {
        num1 = n1;
        num2 = n2;
    }
};


typedef char*(*CallBackFuncName)(PARAM);


char* PrintTwoNum(PARAM Param)
{
    cout << "第一个数: "<< Param.num1 << endl;
    cout << "第二个数: " << Param.num2 << endl;
    return nullptr;
}

char* AddTwoNum(PARAM Param)
{
    cout << "两数之和为: " << Param.num1 + Param.num2 << endl;
    return nullptr;
}

char* CallPrintFunc(PARAM param, CallBackFuncName pCallBackFunc)
{
    (*pCallBackFunc)(param);
    return nullptr;
}

int main()
{
    PARAM p(1,2);
    if (CallPrintFunc(p, PrintTwoNum) == nullptr)
        cout << "use callback function successful" << endl;

    if (CallPrintFunc(p, AddTwoNum) == nullptr)
        cout << "use callback function successful" << endl;
    system("pause");
    return 0;
}

本来想用opencv做例子的,最后还是没用上,函数的类型全部采用项目中的char*返回值,类PARAM表示回调函数的参数项,在封装算法库的时候自己的数据流要做成统一的数据结构,所以用类来存放数据更好一些

typedef char*(*CallBackFuncName)(PARAM);

这里我的理解是:将后面回调函数的返回值定义为一个固定的名字,我在命名的时候也特意给他起名为“CallBakcFuncName回调函数的名字”。

这样在调用回调函数时

char* CallPrintFunc(PARAM param, CallBackFuncName pCallBackFunc)//注册回调函数
{
    (*pCallBackFunc)(param);
    return nullptr;
}

int main()
{
    PARAM p(1,2);
    if (CallPrintFunc(p, PrintTwoNum) == nullptr)//调用回调函数
        cout << "use callback function successful" << endl;

    if (CallPrintFunc(p, AddTwoNum) == nullptr)//调用回调函数
        cout << "use callback function successful" << endl;
    system("pause");
    return 0;
}

我们就能知道CallBackFuncName这个东名字表示的就是回调函数,他就是回调函数的返回值类型,回调函数作为参数传入了回调函数的注册函数,其他模块通过调用这个注册函数来调用功能不同的回调函数

在注册回调函数的函数CallPrintFunc中,回调函数作为参数传入,pCallBackFunc就是传入的变量,他就表示一个回调函数,注册函数中这样使用它

(*pCallBackFunc)(param);

这应该就代表了所有的回调函数,同时注册函数本身有两种写法,因为它本身的返回值也是char*的,所以他也可以这么写

char* CallPrintFunc(PARAM param, CallBackFuncName pCallBackFunc)
{
    return (*pCallBackFunc)(param);
    //return nullptr;
}

直接return

最后可以看到,在调用回调函数时通过传入不同的函数(它们的类型都是相同的),可以实现同一个接口不同函数(模块)的调用,回调函数的注册函数(CallPrintFunc)就是调用不同模块的接口。

原文地址:https://www.cnblogs.com/wangtianning1223/p/13467137.html