iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >简单聊聊C++中回调函数的实现
  • 845
分享到

简单聊聊C++中回调函数的实现

2024-04-02 19:04:59 845人浏览 独家记忆
摘要

目录前言1 函数指针2 C风格的回调函数3 c++风格的回调函数4 多态类型的回调函数5 通过function和bind实现回调函数功能6 总结前言 回调函数其实和普通函数一样,不同

前言

回调函数其实和普通函数一样,不同的是普通函数是直接在程序中进行调用,回调函数是通过函数指针将它的地址传递给其它函数,函数执行在其它函数体执行,这个过程就叫做回调。所以,C++回调函数也并非高大上的技术,它的原理无非就是函数指针或者对象的传递。

回调函数机制:

1、定义一个函数(普通函数即可);

2、将此函数的地址注册给调用者;

3、特定的事件或条件发生时,调用者使用函数指针调用回调函数。

本文就从函数指针开始对回调函数进行说明。

1 函数指针

函数指针是指一个变量,函数对象创建后就会分配一个地址,这个地址可以通过变量进行保存。这个变量就叫做函数地址变量,也可以称之为函数指针。
函数指针的定义方式如下:

int(*p)(int, int);

如上,定义了一个函数指针,它指向一个包含两个整型参数且返回值为整型数值的函数对象。

函数指针在C和C++中被经常使用,使用方式也很简单,具体如下面代码所示:

typedef int (*Ptr)(int,int);
int add(int a,int b){
    return (a+b);
}
int main()
{
    Ptr pInt = add;
    cout<<pInt(3,5)<<endl;
    return 0;
}

2 C风格的回调函数

上面的代码是将一个函数地址赋值给了函数指针,下面将函数作为回调函数的参数的方式进行处理,函数处理结果也是一致的。代码如下:

typedef int (*Ptr)(int, int);
int CallBack(Ptr pInt, int a, int b) {
  return pInt(a, b);
}
int add(int a, int b) {
  return (a + b);
}
int main()
{
  cout << CallBack(&add, 3, 5) << endl;
}

代码如上,代码运行结果为:8。

实现是不是很简单,通过回调函数,可以让用户自己定义自己的业务实现,且这种方式在网络通讯中被经常使用,下面在看看一下如果回调函数是类成员函数的时候如何实现。

3 C++风格的回调函数

在C++中,如果回调函数是类成员函数,需要将回调函数定义成为静态。当然也可以使用全局函数,但是这样做就会破坏C++的封装性。

下面的代码就演示了将一个静态成员函数作为回调函数的使用情况。

typedef int (*Ptr)(int,int);
int RegFuncation(Ptr pInt,int a,int b){
    return pInt(a,b);
}
class COperMath{
public:
    //回调函数
    static int add(int a,int b){
        return (a+b);
    }
    //注册函数
    void RegFuncationCallBack(){
       cout<<RegFuncation(add,3,5)<<endl;
        return ;
    }
};
int main()
{
    COperMath pInst;
    pInst.RegFuncationCallBack();
    return 0;
}

4 多态类型的回调函数

在前面的代码中,都是使用函数指针的方式进行,下面的代码使用多态的方式实现,为了演示实现的方式,代码比较简单。

class CAniable{
public:
    virtual void eat()=0;
};
class CCat:public CAniable{
public:
    virtual void eat(){
        cout<<"Cat like mouse"<<endl;
    }
};

class CDog:public CAniable{
public:
    virtual void eat(){
        cout<<"Dog like shit"<<endl;
    }
};
int main()
{
    CAniable *pBase = new CCat();
    pBase->eat();
    CAniable *pBase1 = new CDog();
    pBase1->eat();
    delete pBase;
    delete pBase1;
    return 0;
}

代码运行结果为:

Cat like mouse
Dog like shit

上面的代码通过定义一个纯虚的基类,里面定义了一个纯虚的公共接口,其它类都继承自基类,在使用时就可以将这个类指针传递给回调函数,进而实现回调的功能。

5 通过function和bind实现回调函数功能

function功能很函数指针功能类似,不同的是function可以调用各种对象和函数。function还可以调用lamda表达式。具体如下所示。


typedef function<int(int,int)> func;
int add(int a,int b){
    return (a+b);
}

class COperMath{
public:
    float Sum(float a,float b){
        return(a+b);
    }
};

int main()
{
    //function包裹add
    func f = &add;
    cout<<"func="<<f(3,5)<<endl;
    //function和bind联合使用
    COperMath cMath;
    function<float(float,float)> func_bind = bind(&COperMath::Sum,ref(cMath),placeholders::_1,placeholders::_2);
    cout<<"func_bind="<<func_bind(6.0,10.0)<<endl;
    return 0;
}

代码运行结果为:

func=8
func_bind=16

如上,本文使用了5种方式对回调函数进行实现,在实际项目中,使用回调函数的场景比这里要复杂的多,希望大家在实际使用中能够运用自如。

6 总结

回调函数在实际中有许多作用。假设有这样一种情况:我们要编写一个库,该库实现排序功能,但是又不希望在库里实现排序逻辑,这样就可以使用回调函数让用户自己通过函数指针的方式将排序逻辑传进来进行排序。回调可用于网络编程中,如通过回调函数获取服务端返回的数据信息并进行处理。

到此这篇关于C++中回调函数实现的文章就介绍到这了,更多相关C++回调函数实现内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 简单聊聊C++中回调函数的实现

本文链接: https://www.lsjlt.com/news/162954.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 简单聊聊C++中回调函数的实现
    目录前言1 函数指针2 C风格的回调函数3 C++风格的回调函数4 多态类型的回调函数5 通过function和bind实现回调函数功能6 总结前言 回调函数其实和普通函数一样,不同...
    99+
    2024-04-02
  • C#实现简单的聊天窗体
    本文实例为大家分享了C#实现简单的聊天窗体的具体代码,供大家参考,具体内容如下 一、要使用(学习)到的知识点 1、textBox控件 (1)功能:允许用户输入文本,并提供多行编辑和密...
    99+
    2024-04-02
  • 简单聊聊Golang中defer预计算参数
    目录什么是deferGo语言defer预计算参数总结什么是defer defer用来声明一个延迟函数,把这个函数放入到一个栈上, 当外部的包含方法return之前,返回参数到调用方法...
    99+
    2024-04-02
  • 简单聊聊Python中的wraps修饰
    在了解wraps修饰器之前,我们首先要了解partial和update_wrapper这两个函数,因为在wraps的代码中,用到了这两个函数。 partial 首先说partial函数,在官方文档的描述中,这个函数的声明如下:...
    99+
    2023-01-31
    简单 Python wraps
  • 简单聊聊Vue中的ref,toRef与toRefs
    目录一、ref二、toRef三、torefs一、ref ref 函数,可以把简单数据类型包裹为响应式数据(复杂类型也可以),注意 JS 中操作值的时候,需要加 .value 属性,模...
    99+
    2023-05-14
    Vue ref toRef toRefs使用 Vue ref toRef toRefs Vue ref Vue toRef Vue toRefs
  • C语言实现简单的聊天室功能
    用C语言实现简单的聊天室功能,供大家参考,具体内容如下 服务器端 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> ...
    99+
    2024-04-02
  • 简单聊聊vue3.0 sfc中setup的变化
    目录前言标准的sfc写法 script-setup 变量暴露组件挂载props 自定义事件 总结前言 在vue中,sfc(单文件组件)指的是文件后缀名为.vue的特殊文件格式,它允许...
    99+
    2024-04-02
  • 一起聊聊C++中的特殊成员函数
    目录一:背景二:特殊成员函数1. 默认构造函数2. 析构函数3. 赋值构造函数4. 赋值运算符一:背景 在C#中要说类默认给我们定义的特殊成员函数,莫过于构造函数,但在 C++ 中这...
    99+
    2024-04-02
  • C++ select模型简单聊天室的实现示例
    TIPS:以下使用CMake项目进行开发。关于何为CMake,链接:https://www.jb51.net/article/247089.htm 简单聊天室效果展示 简单聊天室服...
    99+
    2024-04-02
  • 简单聊聊Java程序中的换行符
    目录常见的换行符\r\n和\n的区别换行符的解析小结常见的换行符 Java程序中的换行符一般使用“\n”表示,它是一个转义字符,表示换行符。根据操作系统的不同...
    99+
    2023-03-21
    Java 换行符使用 Java换行符
  • 简单聊一聊Go语言中的数组和切片
    目录1. 数组2. 切片(Slice)append 函数总结1. 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,因此...
    99+
    2024-04-02
  • C语言回调函数的简单运用
    目录一、什么是回调函数二、简单的回调函数三、带参数的回调函数一、什么是回调函数 因为在程序中,我们有很多的库函数,我们也有很多的上层函数,为了增加程序的灵活性,我们就将一些函数指针作...
    99+
    2024-04-02
  • c#基于WinForm的Socket实现简单的聊天室 IM
    目录1:什么是Socket2:客服端和服务端的通信简单流程3:服务端Code:4:客服端Code:5:测试效果:6:完整Code GitHUb下载路径 7:这个只是一个简单...
    99+
    2024-04-02
  • C#基于Socket实现简单聊天室功能
    因为这段时间在学习Socket,所以就试着写了一个简单的聊天室。主要分为服务器端和多个客户端。利用服务器端作数据中转站,实现消息群发。 1、服务器端有两个类: using Syste...
    99+
    2024-04-02
  • 聊一聊C++虚函数表的问题
    之前只是看过C++虚函数表相关介绍,今天有空就来写代码研究一下。 面向对象的编程语言有3大特性:封装、继承和多态。C++是面向对象的语言(与C语言主要区别),所以C++也拥有多态的特...
    99+
    2024-04-02
  • python实现的简单点对点(p2p)聊
    点对点聊天首先是基于多线程的网络编程,其次就是将每一个连接都保存为一个具有独一属性的对象并添加到连接列表中,对于每一个连接对象发送过来的信息必须要包含主要的三项内容(from,to,messages),这样当信息发送到服务器之后服...
    99+
    2023-01-31
    点对点 简单 python
  • 简单聊聊Js中的常见错误类型
    目录前言JavaScript中的错误类型ErrorEvalErrorRangeErrorReferenceErrorSyntaxErrorTypeErrorURIError总结前言 ...
    99+
    2024-04-02
  • 聊聊使用RedisTemplat实现简单的分布式锁的问题
    目录不使用redisson框架实现Redis分布式锁1.在SpringBootTest中编写测试模块1.1:使用占位符加锁:1.2:使用占位符设置有效时间解决死锁问题:1.3:使用l...
    99+
    2024-04-02
  • Java实现简单的聊天室功能
    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一、客户端的创建 1.我们可以用Socket来创建客户端 public class Client...
    99+
    2024-04-02
  • Java实现简单聊天机器人
    本文实例为大家分享了Java实现简单聊天机器人的具体代码,供大家参考,具体内容如下 整个小案例:整合了Java socket编程、jdbc知识(ORM/DAO) 创建数据库和表,准备...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作