版权声明:本文主要内容均来自 世外桃源 的原创文章,遵循 CC 4.0 BY-SA 版权协议。
原文出处链接:https://blog.csdn.net/qq_14820081/article/details/89231995
回调函数的注册
在c++中,注册函数的参数是回调函数指针。
解释
以层次模型来解释:
注册函数所在的类,是调用回调函数的决定者【下层】,决定何时何种条件下去调用回调函数。而真正实现回调函数功能的类【上层】,不会直接调用该回调函数。
一般来说,会把【上层的】回调函数通过【下层的】注册函数,保存在注册函数所在类的成员变量【下层】中,在适当的时候,【下层】通过该成员变量去访问注册过的回调函数。在c++中,该成员变量是同种类型的函数指针。
加入了一些定语,是不是就层次分明了?!!🤣
代码实现
说明:大佬的代码也挺完美的,我只是按照自己的理解和思路,拆分了一下。
模拟下层的函数库
lib.h
#pragma once
#include <stdio.h>
#include <functional>
typedef std::function <void () > CallBack; // 定义函数类型
void hook() ; // 执行回调函数
void register_hook_callback(CallBack p_callback); // 只是提供一个注册函数
lib.cpp
#include "lib.h"
CallBack p[5] = { NULL }; // 创建一个函数指针数组
void hook() // 官方封装起来
{
int i = 0;
for (i = 0; i < 5; i++) {
if (p[i] != NULL) {
p[i]();
}
}
}
void register_hook_callback(CallBack p_callback) // 只是提供一个注册函数
{
int i = 0;
for (i = 0; i < 5; i++) {
if (p[i] == NULL) {
p[i] = p_callback;
break;
}
}
}
模拟上层的函数 main.cpp
#include <functional>
#include <windows.h>
#include "lib.h"
using namespace std;
void test01();
void test02();
int main()
{
register_hook_callback(test01);
register_hook_callback(test02);
while(1)
{
hook();
printf("=====运行========\n");
Sleep(1000);
}
}
// 上层用户自己要定义回调函数
void test01()
{
printf("\ntest01 callback\n");
}
void test02()
{
printf("\ntest02 callback\n");
}
总结
还是以层次模型为解,注册只是让下层拥有上层定义的函数指针,不一定局限于使用函数,也可以直接赋值。