C++ 回调函数的多种用法
什么是回调函数, 就是以函数指针做参数传递给另一个函数称之为回调函数, 字面意思很简单, 但就这几个字想理解回调函数, 那又很难。因此别就这这字面意思, 只要知道怎么用, 在什么情况下用就行了
什么场景下需要使用回调函数, 回调函数主要是完成通知功能, 例如我领导给我分配另外工作, 但是我手里工作又没做完, 那领导总不可能没过个几个小时就跑过来问一下,这样我们两个人都很烦, 而在代码中如果这样实现(需要开一个线程, 不停的轮寻)也很消耗系统资源, 所以最好的办法就是等我手里的工作完成了, 我自己去和领导说,然后进入下个工作任务, 而在我们代码中想要这样实现就需要通过回调函数来完成
回调函数3要素
1: 定义一个函数指针(和回调函数的参数类型, 数量, 顺序, 返回值全部一致)
2: 定义一个类成员静态回调函数(备注:类成员 回调函数必须是static)
3: 回调函数和函数指针绑定在一起
回调函数用法1: C98回调函数写法
//该类相当于上面例子中员工(我)的角色
#pragma once //打印姓名相当于上面例子中的未完成的工作
#include <stdio.h>
#include <string.h> using namespace std;
//定义一个函数指针
typedef void(*PrintName)(string strName); enum CallType
{
NAME,
AGE,
GRADE,
}; class CallBack
{
public:
CallBack();
~CallBack(); public:
void TestCallBack(CallType type);
public:
PrintName m_PrintName;
}; #include "CallBack.h" CallBack::CallBack()
{
} CallBack::~CallBack()
{
} void CallBack::TestCallBack(CallType type)
{
switch (type)
{
case NAME:
m_PrintName(string("name"));
break;
default:
break;
}
}
//该类相当于上面例子中领导的角色
#include <memory>
#include "CallBack.h"
class BaseCall
{
public:
BaseCall();
~BaseCall(); public:
//静态的类成员函数
static void onPrintName(string strName);
private:
std::shared_ptr<CallBack> m_CallBack;
}; BaseCall::BaseCall()
{
m_CallBack = make_shared<CallBack>();
//和回调函数绑定
m_CallBack->m_PrintName = onPrintName;
m_CallBack->TestCallBack(NAME);
} BaseCall::~BaseCall()
{ } void BaseCall::onPrintName(string strName)
{
printf("姓名: %s\n", strName.c_str());
}
上面就是C11之前的写法, 比较复杂, 需要定义一个函数指针, 定义完之后还需要两个绑定在一起, 而C11出来之后, 就是会简化以前的复杂的编码风格, 利用function, 和band函数能轻松的实现一个回调函数操作,
C11的回调函数用法
//该类相当于上面例子中员工(我)的角色using namespace std;
typedef void(*PrintName)(string strName); enum CallType
{
NAME,
AGE,
GRADE,
}; class CallBack
{
public:
CallBack();
~CallBack(); public:
void TestCallBack(CallType type);
public:
PrintName m_PrintName;
function<void(int)> m_PrintAge; //C11 写法1
}; #include "CallBack.h"
#include "BaseCall.h" CallBack::CallBack()
{
} CallBack::~CallBack()
{
} void CallBack::TestCallBack(CallType type)
{
switch (type)
{
case NAME:
m_PrintName(string("name"));
break;
case AGE:
m_PrintAge(100);
break;
case GRADE:
{
// C11 写法2
function<void(int)> printGrade = bind(BaseCall::onPrintGrade, placeholders::_1);
printGrade(2019);
}
break;
default:
break;
}
}
//该类相当于上面例子中领导的角#include <memory>
#include "CallBack.h" class BaseCall
{
public:
BaseCall();
~BaseCall(); public:
static void onPrintName(string strName);
static void onPrintAge(int nAge);
static void onPrintGrade(int);
private:
std::shared_ptr<CallBack> m_CallBack;
}; BaseCall::BaseCall()
{
m_CallBack = make_shared<CallBack>();
m_CallBack->m_PrintName = onPrintName;
m_CallBack->m_PrintAge = bind(BaseCall::onPrintAge, placeholders::_1); //C11写法1 m_CallBack->TestCallBack(NAME);
m_CallBack->TestCallBack(AGE);
m_CallBack->TestCallBack(GRADE);
} BaseCall::~BaseCall()
{ } void BaseCall::onPrintName(string strName)
{
printf("姓名: %s\n", strName.c_str());
} void BaseCall::onPrintAge(int nAge)
{
printf("年龄: %d\n", nAge);
} void BaseCall::onPrintGrade(int nGrade)
{
printf("班级:%d\n", nGrade);
}
通过上面C11的function和band 2个函数能够简单实现函数回调, C11写法是在领导类中和回到函数绑定在一起, 而写法2更简单,直接在员工类中和回调函数绑定在一起,回调函数的使用就简述这么多了,希望对大家有所帮助
C++ 回调函数的多种用法的更多相关文章
- element-ui的回调函数Events的用法
做轮播的时候想用这个change回调函数,但是官方文档上竟然就只列了这么一行东西,完全没有示例代码(也可能我没找到哈) 鼓捣了半天,东拼西凑终于找到了靠谱的使用方法,其实很简单 在轮播组件上加上@ch ...
- PHP学习笔记1.1——date()函数的多种用法,取出各种不同格式的时间,非常全面
语法格式:date(string format.int timestamp); 参数一:format指定输出的日期和时间的格式,具体的参见下表; 参数二:timestamp是可选参数,是时间戳,如果不 ...
- JS中回调函数的简单用法
a能拿b,b能拿到c,c能拿到d,实现a拿到d的东西. function a() { b(function (data) { console.log(data); }); } function b(c ...
- javascript回调函数笔记
来源于:https://github.com/useaname/blog-study 在Javascript中,函数是第一类对象.意味函数可以像对象一样按照第一类被管理使用.回调函数是从一个叫函数式编 ...
- [转]理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- 【JavaScript】理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- js中的回调函数的理解
一,常见的但是不是特别注意的回调方法. 1.1,ajax $.ajax({ url:"test.json", type: "GET", data: {usern ...
- PHP回调函数call_user_func()和call_user_func_array()的使用
call_user_func():把第一个参数作为回调函数调用 用法:call_user_func ( callable $callback [, mixed $parameter [, mixed ...
- JS回调函数(深入篇)
<有些错别字> 在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中 ...
随机推荐
- 【LGR-061】洛谷10月月赛 II & X Round 4 Div.1&Div 2
X Round的题目质量还是一如既往的高 然而每次周末我都要写作业没法用心打233主要是被陈指导放了鸽子 占坑代填(最近坑开的有点多)
- CF582E Boolean Function(DP,状态压缩,FMT)
简单题. 我第二道自己做出来的 2900 没毛病,我没切过 2800 的题 lqy:"CF 评分 2800 是中等难度" 我活个啥劲啊 为了方便(同时压缩状态个数),先建出表达式树 ...
- Unity BehaviorDesigner行为树基础总结
BehaviorDesigner——行为树,用于控制和实现AI逻辑,类似于这样: 上面这个行为树实现了这样的逻辑: 当Player有Input时按照Input值来移动,无Input时查找最近的可攻击目 ...
- 黄聪:Mysql开启InnoDB引擎出现1067错误的解决办法
在my.ini文件添加下面这行: innodb_force_recovery = 1 可以解决:InnoDB: Attempted to open a previously opened tables ...
- http服务源码分析
多读go的源码,可以加深对go语言的理解和认知,今天分享一下http相关的源码部分 在不使用第三方库的情况下,我们可以很容易的的用go实现一个http服务, package main import ( ...
- WPF/.net core WPF 系统托盘支持
WPF 原生不支持系统托盘图标,需要依靠其它方式处理. 1 使用 WinForm 的支持 WPF最小到系统托盘 - Arvin.Mei - 博客园 2 使用 wpf-notifyicon 库 hard ...
- .Net与其他公司接口对接心得
第一次搞这玩意,心里有点紧张,万事开头难,第一次搞过之后,以后就容易了,所以将这次经历记录下来. 这里我们暂且把对接的公司叫A吧,A公司会提供一个接口对接说明,下面是A公司提供的接口说明 请求内容说明 ...
- 这可能最简单的一种PS图片特效,零基础小白教程
不少小伙伴都想学习PS,可是又觉得PS很难,学了一段时间却还是做不出什么惊艳的效果,没关系!小编今天就来教大家做一个超级简单的图片特效,就算是小白也能轻松学会!我们先来看看图片效果~ 想知道怎么做吗? ...
- uni-app学习(三)好用的插件1
1. uni-app学习(三) 1.1. async/await使用 表示异步处理,可使用then函数继续操作,返回的是Promise async function timeout() { retur ...
- QML::常用属性
Item 属性: Item 类型比较特殊,因为它是所有其他可视化类型的基类型. Qt Quick中所有可视化类型都基于 Item. Item 对象本身没有一个可视化的外观,但是它定义了可视化项目中所有 ...