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更简单,直接在员工类中和回调函数绑定在一起,回调函数的使用就简述这么多了,希望对大家有所帮助



posted @ 2019-11-11 15:59  Software_hul  阅读(9303)  评论(1编辑  收藏  举报