系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、回调函数
- 1.1 回调函数基本概念
- 1.2 简单实现
- 二、代码案例
- 1.代码示例
- 总结
前言
了解回调函数的基本概念,函数指针的使用、简单信号与槽的实现机制;
一、回调函数
1.1 回调函数基本概念
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针
(地址)作为参数传递
给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
A “callback” is any function that is called by another function which takes the first function as a parameter。
也就是说,函数 F1 调用函数 F2 的时候,函数 F1 通过参数给 函数 F2 传递了另外一个函数 F3 的指针,在函数 F2 执行的过程中,函数F2 调用了函数 F3,这个动作就叫做回调(Callback)
,而先被当做指针传入、后面又被回调的函数 F3 就是回调函数。
1.2 简单实现
创建函数指针,指向指定函数。
void hanshus1()
{
cout <<"my hanshus1"<<endl;
}
int hanshus2(int)
{
cout <<"my hanshus2"<<endl;
return 0;
}
void (*hanshu1)();
int (*hanshu2)(int);
int main()
{
hanshu1 = hanshus1;
hanshu1(); // 输出 " my hanshus1 "
hanshu2 = hanshus2;
hanshu2(2); // 输出 “my hanshus2”
}
二、代码案例
简单实现信号与槽机制:
参考代码:
https://blog.csdn.net/weixin_41374099/article/details/115687655
1.代码示例
代码如下(示例):
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define MAX_SLOT_FUNCTION 20 //一个信号最多连接的槽函数数 //一个函数可以被任意多个信号连接
//槽函数类型
typedef void (*slot_t)();
//信号类型
typedef struct _signal_t
{
slot_t slot[MAX_SLOT_FUNCTION];
int count; //槽函数数量
}signal_t;
//信号初始化
signal_t* signal();
//添加槽函数
void connect(signal_t* _signal, slot_t _slot);
//发射信号
void emit(signal_t* _signal);
//销毁
void del(signal_t* _signal);
//信号初始化
signal_t* signal()
{
signal_t* s = (signal_t*)malloc(sizeof(signal_t));
s->count = 0;
for (int i = 0; i < MAX_SLOT_FUNCTION; ++i)
{
s->slot[i] = NULL;
}
return s;
}
//添加槽函数
void connect(signal_t* _signal, slot_t _slot)
{
_signal->slot[_signal->count] = _slot;
++_signal->count;
}
//发射信号
void emit(signal_t* _signal)
{
for (int i = 0; i < _signal->count; ++i)
{
slot_t func = _signal->slot[i];
if (func != NULL) //
{
func();
}
}
}
//销毁
void del(signal_t* _signal) {
for (int i = 0; i < _signal->count; ++i)
{
_signal->slot[i] = NULL;
}
_signal->count = 0;
free(_signal);
}
//准备几个槽函数!!!
void setup()
{
static int i = 0;
printf("setup > 我被点击了%d次,啊啊啊啊\n", ++i);
}
void draw()
{
static int i = 0;
printf("draw > 我被点击了%d次,啊啊啊啊\n", ++i);
}
void loop()
{
static int i = 0;
printf("loop > 我被点击了%d次,啊啊啊啊\n", ++i);
}
void test()
{
//自定义信号
signal_t* clicked = signal();
signal_t* moved = signal();
connect(clicked, setup);
connect(clicked, draw);
connect(clicked, loop);
connect(moved, setup);
connect(moved, draw);
//发射信号
printf("---------------------------------------\n");
emit(clicked);
emit(clicked);
printf("---------------------------------------\n");
emit(moved);
emit(moved);
emit(moved);
printf("---------------------------------------\n");
emit(clicked);
emit(clicked);
emit(clicked);
printf("---------------------------------------\n");
}
int main()
{
test();
return 0;
}
运行截图:
总结
- 回调函数和普通函数的区别;
- 函数指针的使用
- 信号与槽的机制