初识回调函数

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

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

#include<iostream>#include<opencv2/opencv.hpp>
using namespacestd;
using namespacecv;

classPARAM
{
public:
    intnum1;
    intnum2;

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


typedef char*(*CallBackFuncName)(PARAM);


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

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

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

intmain()
{
    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);
    returnnullptr;
}

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

初识回调函数第1张

免责声明:文章转载自《初识回调函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇axis1.4开发webservice客户端(快速入门)-基于jdk1.4(转) Linux命令学习手册-arp命令下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

FreeRTOS 任务与调度器(1)

 前言: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容FreeRTOS文件如下: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容 在开始介绍函数之前,首先我们先简单了解一下任务状态: •...

会话、进程组与僵死进程

  1.   终端       在Linux系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端(Controlling Terminal),Shell进程启动的其他进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进...

Simulink仿真入门到精通(十四) Simulink自定义环境

14.1 Simulink环境自定义功能 sl_sustomization.m函数是Simulink提供给用户使用MATLAB语言自定义Simulink标准人机界面的函数机制。若sl_sustomization.m函数存在于MATLAB的搜索路径中,在当Simulink启动时就会读取此文件的内容进行Simulink的人机界面的初始化。Simulink本身就...

【转】EVC /PB /WinCE开发问题

1. 在ce自制平台中如何添加自己的驱动?cec文件和reg,bib文件有何区别?看混了,不知道如何才能让驱动注册到平台中。另外,reg和bib是我在编写驱动必须要自己写的么 CE 的驱动分为本机驱动和流驱动,本机驱动你可以修改源码(在%_WINCEROOT%/PUBLIC/COMMON/OAK/DRIVERS),然后 build驱动源码,之后用PB编译...

Vue3+TypeScript?看这一篇就够了

1、TypeScript快速上手 1.1 初识 TypeScript TypeScript 的介绍 TypeScript是一种由微软开发的开源、跨平台的编程语言。它是JavaScript的超集,最终会被编译为JavaScript代码。 2012年10月,微软发布了首个公开版本的TypeScript,2013年6月19日,在经历了一个预览版之后微软正式发布...

python 装饰器语法糖(@classmethod @staticmethod @property @name.)原理剖析和运用场景

引用:http://blog.csdn.net/slvher/article/details/42497781 这篇文章系统的介绍这几者之间的关系和区别。有兴趣的朋友可以到上面的链接查看原文,这里我把原文拷贝如下(如有侵权,通知马上删除) ===========================================================...