C/C++|回调函数的正确打开方式

最近在学习muduo库,其中的回调给我弄得晕头转向,后来才发现主要是回调函数的使用逻辑还没摸清楚,所以这里用一个简单的案例,来探究他们都是如何使用回调函数的。

一般回调函数都是用在类中:

我们将创建一个 EventHandler 类,用于处理事件,并允许用户设置自定义的回调函数。当事件发生时,EventHandler 会调用用户设置的回调函数。

#include <iostream>
#include <functional>class EventHandler {
public:using Callback = std::function<void(int)>;//设置回调函数void setCallback(Callback cb) {callback_ = std::move(cb);}//触发事件并调用回调函数void triggerEvent(int eventCode) {if (callback_) {callback_(EventCode);}}
private:Callback callback_;
};

在这个定义中:

  • EventHandler 类中有一个 Callback 类型定义,它是一个 std::function<void(int)> 类型,用于保存回调函数。
  • setCallback 方法允许用户设置自定义的回调函数。
  • triggerEvent 方法在事件发生时调用回调函数。

1. 实现自定义回调函数并设置到类中

void myCallbackFunction(int eventCode) {std::cout << "Event triggered with code: " << eventCode << std::endl;
}int main() {EventHandler handler;// 设置自定义回调函数handler.setCallback(myCallbackFunction);// 触发事件,调用回调函数handler.triggerEvent(42);  // 输出:Event triggered with code: 42return 0;
}

2. 使用lambda表达式作为回调

int main() {EventHandler handler;// 设置 lambda 表达式作为回调函数handler.setCallback([](int eventCode) {std::cout << "Lambda: Event triggered with code: " << eventCode << std::endl;});// 触发事件,调用回调函数handler.triggerEvent(99);  // 输出:Lambda: Event triggered with code: 99return 0;
}

在muduo网络库中,大量的类都有回调函数,所以我们有一个一定要搞清楚,那就是:该回调函数属于哪个类?该回调的触发事件是什么?谁在给他设置回调函数,是用户?还是别的类?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【贪心算法题目练习】

1. 分发饼干 这道题目和我们之前讲到的田忌赛马的问题很相似&#xff0c;只不过这这里不需要劣等马去抵消掉优等马&#xff0c;直接上贪心策略&#xff1a; 先将两个数组排序。针对胃口较小的孩子&#xff0c;从小到大挑选饼干: i. 如果当前饼干能满足&#xff0c;直接喂(最小…

Windows安装Linux子系统WSL

Windows安装Linux子系统WSL 一、相比直接安装虚拟机优缺点:1、优点:2、缺点:二、开启WSL服务1、开启开发人员模式2、点开你电脑的设置然后点击应用3、安装过程4.启动5.那么共享文件在哪里呢?注意三、集成VScode开发环境1、新建终端2、选择WSL一、相比直接安装虚拟机优缺点:…

Flutter开发效率提升1000%,Flutter Quick教程之对组件进行拖拽与接收

1&#xff0c;首先&#xff0c;所有可以选择的组件&#xff0c;都在左边的组件面板里。从里面点击任何一个&#xff0c;按住左键&#xff0c;向右边的手机面板上进行拖拽即可。 2&#xff0c;拖拽后&#xff0c;我们要选择一个接收组件。什么时候可以接收组件&#xff0c;就是当…

Go 内存分配机制

是什么&#xff1f; Go语言内置运行的runtime&#xff0c;抛弃传统的内存分配方式&#xff0c;比如内存池&#xff0c;预分配等&#xff0c;这样不会每次内存分配都给系统调用。 为什么&#xff1f; golang的内存分配机制将程序员从手动管理内存的繁琐任务脱离出来。 怎么用…

反转字符串中的单词-力扣

此题将问题分为三步进行解决&#xff1a; 第一步&#xff0c;删除字符串中多余的空格&#xff0c;removeSpaces函数中删除所有的空格&#xff0c;并手动在每个单词后添加一个空格&#xff0c;最后重构字符串s第二步&#xff0c;将整个字符串反转第三步&#xff0c;对反转后的字…

代码随想录训练营Day57(单调栈解决最近大于或小于关系):Leetcode739、496、面试经典百题:Leetcode80、274

Leetcode739&#xff1a; 问题描述&#xff1a; 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请…

龙叔Linux:别名(alias)

在Linux中&#xff0c;别名&#xff08;alias&#xff09;是一个命令的简短形式&#xff0c;通常用于简化或替换更长的命令序列。你可以使用alias命令来创建、查看和删除别名&#xff0c;定制自己专属的命令。一、创建别名 1.1、临时创建 你可以使用alias命令在命令行中直接定…

B-TREE教程(个人总结版)

背景 在计算机科学中&#xff0c;数据存储和检索的效率是一个重要的研究课题。B-树&#xff08;B-Tree&#xff09;作为一种自平衡树结构&#xff0c;特别适合于在磁盘存储中处理大规模数据。它通过保持树的高度平衡&#xff0c;使得搜索、插入和删除操作的时间复杂度保持在对…

Spring (30)如何在Spring应用中启用Spring Security

在Spring应用中启用Spring Security涉及几个关键步骤&#xff0c;包括引入Spring Security依赖、创建安全配置类以及配置应用的安全细节。下面&#xff0c;我们将深入探讨这些步骤&#xff0c;并通过代码示例和源码分析来详细解析如何启用和配置Spring Security。 1. 引入Spri…

python 五子棋游戏代码

下面是一个简单的五子棋游戏的Python代码示例。这个示例包括了游戏逻辑和用户界面的基本实现&#xff0c;但并不完整&#xff0c;例如没有AI对战功能。 import numpy as np import pygame # 初始化游戏界面 def init_game(): global board, screen, width, height width,…

微信小程序的view的属性值和用法

在微信小程序中&#xff0c;view 是一个基础的视图组件&#xff0c;用于承载其他视图组件或者展示文本、图片等内容。view 组件具有多种属性&#xff0c;用于控制其行为和样式。以下是一些常用的 view 属性及其用法&#xff1a; class / style: 控制视图的样式&#xff0c;可以…

docker部署Minio对象存储及使用

1.拉取镜像 docker pull minio/minio2.创建数据目录 mkdir -p /data/minio/data3.启动容器 docker run -p 39000:9000 -p 39090:9090 \ --name minio \ -d --restartalways \ -e "MINIO_ACCESS_KEYjyadmin" \ -e "MINIO_SECRET_KEYjyzx2023" \ -v /data…

【八股】Hibernate和JPA:理解它们的关系

在Java开发中&#xff0c;持久化框架是至关重要的工具&#xff0c;它们帮助开发者将Java对象与关系数据库中的数据进行映射和管理。Hibernate和JPA&#xff08;Java Persistence API&#xff09;是两个广泛使用的持久化框架。那么&#xff0c;Hibernate和JPA之间到底是什么关系…

沃通CA根证书获数科网维《商用密码根证书授信证明》

近日&#xff0c;沃通CA三款根证书获数科网维《商用密码根证书授信证明》&#xff0c;将列入数科受信根证书列表并预置到数科文档阅读器。这标志着沃通CA国产化适配能力进一步提升&#xff0c;沃通国产文档签名证书与数科国产文档阅读器兼容互认&#xff0c;能够更好地响应政企…

Nginx编译安装,信号,升级nginx

编译安装nginx&#xff1a;前面博客有写编译安装过程 systemctl stop firewalld setenforce 0 mkdir /data cd /data wget http://nginx.org/download/nginx-1.18.0.tar.gz tar xf nginx-1.18.0.tar.gz cd nginx-1.18.0/ yum -y install make gcc pcre-devel openssl-devel …

揭秘:Java字符串对象的内存分布原理

先来看看下面寄到关于String的真实面试题&#xff0c;看看你废不废&#xff1f; String str1 "Hello"; String str2 "Hello"; String str3 new String("Hello"); String str4 new String("Hello");System.out.println(str1 str2)…

Android 11 Audio strategy配置解析

在启动AudioPolicyService时&#xff0c;通过EngineBase的loadAudioPolicyEngineConfig函数去解析strategy配置。其调用流程如下 接下来就对loadAudioPolicyEngineConfig展开分析 1&#xff0c;解析volume标签 engineConfig::ParsingResult EngineBase::loadAudioPolicyEngine…

Pytorch Lighting 库的学习 mvsplat 的笔记

变量理解&#xff1a; context_image&#xff1a; 表示投影的 refrence image Epipolar Transformer vs Swin Transformer : 不同于 Pixel Splat 使用的是 Epipolar Transformer. MVspalt 使用的是 Swin Transformer&#xff0c; 但是作者在 Code 里面 也使用了 Epipolar Tran…

容器项目之前后端分离

容器化部署ruoyi项目 #需要的镜像nginx、java、mysql、redis、 #导入maven镜像、Java镜像和node镜像 docker load -i java-8u111-jdk.tar docker load -i maven-3.8.8-sapmachine-11.tar docker load -i node-18.20.3-alpine3.20.tar #拉取MySQL和nginx镜像 docker pull mysql…

echarts学习:基本使用和组件封装

前言 我在工作中使用echarts较少&#xff0c;这就导致每次使用时都要从头再来&#xff0c;这让我很头疼。因此我决心编写一系列文章将我参与工作后几次使用echarts所用到的知识记录下来&#xff0c;以便将来可以快速查阅。 一、基本使用 像我一样的新手&#xff0c;想要入门e…