0
点赞
收藏
分享

微信扫一扫

c++回调函数的几种写法(注意成员函数)


主要有3种写法

1.普通函数(全局函数)作为回调函数

这个就跟C语言里面的一样,没什么好说的

2.类的普通成员函数作为回调函数

基本知识

类的成员函数实际上是有一个隐含的void*形参的(由编译器给自动加上的),这个实际上就是所属类给它传递的this指针,不然该成员函数怎么不加前缀就能访问类中的其它成员的嘛。

目标

实现Add类向MainWindow类注册一个成员函数int addFun(),作为回调函数

实际上这个函数全称是 int addFun(void*)。所以注册函数定义时候,就需要把形参给对好

示例代码分析

add.cpp文件(头文件就不展示了,过于简单)

//将函数地址强转为 int(*)(void *) 类型。注:这里成员函数名前加上&才是地址(而全局函数就不需要),否则编译报错

#include "add.h"
#include "mainwindow.h"

extern MainWindow* pMainWindow;

//普通函数(全局函数)
int addFun1()
{
return 2;
}

//类的成员函数
int Add::addFun()
{
return 3;
}

Add::Add()
{
//将函数地址强转为 int(*)(void *) 类型。注:这里成员函数名前加上&才是地址,否则编译报错
pMainWindow->registerFun((int(*)(void *)) &addFun);
}

mainwindow.cpp文件

MainWindow::registerFun(int(*pfun)(void *))
{
mPfun = pfun;
}

//按钮按下后,打印出值
void MainWindow::on_toolButton_clicked()
{
new Add();
void* p; //因为回调函数要求mPfun要求一个形参,这里就随便给一个吧
int a = mPfun(p);
qDebug()<<a; //控制台打印出了 3
}

注意点

回调函数由于在别的地方执行了,不再能访问当初自己的类中的成员了,所以我们注册函数需要再加一个形参,来支持注册的时候可以把当初的this指针也给传过去,那么该成员函数在别的类中,就仍然可以访问它原来所在类的成员了。

3.类的静态成员函数作为回调函数

这个也是很简单,自己看看我的引用博客


举报

相关推荐

0 条评论