• 初识回调函数


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

    #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)就是调用不同模块的接口。

  • 相关阅读:
    HDU 1010 Tempter of the Bone
    HDU 4421 Bit Magic(奇葩式解法)
    HDU 2614 Beat 深搜DFS
    HDU 1495 非常可乐 BFS 搜索
    Road to Cinema
    Sea Battle
    Interview with Oleg
    Spotlights
    Substring
    Dominating Patterns
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/13467137.html
Copyright © 2020-2023  润新知