zoukankan      html  css  js  c++  java
  • 初识回调函数

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

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

  • 相关阅读:
    sublime text 2安装及使用
    C陷阱与缺陷之语法陷阱
    上门洗车APP --- Androidclient开发 之 项目结构介绍
    编写语法分析程序
    TCP header
    boost事件处理
    TP-LINK无线路由器WR340G+ 54M支持WDS
    300M无线路由器 TL-WR842N
    python 2.7 支持dict comprehension
    100M 宽带办理
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/13467137.html
Copyright © 2011-2022 走看看