c++类的成员函数作回调函数为啥要声明为static的
简单说明
C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它。
把成员函数作为回调函数,可以把该成员函数声明为静态成员函数,但这样做有一个缺点,就是会破坏类的结构性,因为静态成员函数只能访问该类的静态成员变量和静态成员函数,不能访问非静态的,要解决这个问题,需要把对象实例的指针或引用做为参数传给它。
因为类的成员函数需要隐含的this指针 而回调函数没有办法提供
代码示例一
//头文件//声明一个函数指针类型,
typedef bool(*CallbackFunc )(void*pThis,double num);Class A
{void FuncA(){m_callBackFunc(m_Ptr,num_A);}void SetCallBack(CallbackFunc callback,void *pthis){m_callBackFunc = callback;m_Ptr = pthis;}CallbackFunc m_callBackFunc;void* m_Ptr;int num_A;
}Class B
{//注意参数要匹配前面声明的函数指针类型,且声明为静态static bool FuncB(void *pVoid,double tmpNum){print<<pVoid->m_num;m_num = tmpNum;print<<pVoid->m_num;}
public:int m_num;
}//调用
main()
{A a;B b;b.m_num = 2.0;a.SetCallBack(FuncB,&b);a.FuncA();//实现了类A调用了b的函数,并把a的成员值传给了b改变了b成员的值
}
这种情况也适用于B包含A的情况,即B里面有A的对象或对象指针,就可以实现b调用a进行一系列操作然后把a的值传回来给b;如下所示
代码示例二
//头文件
typedef bool(*CallbackFunc )(void*pThis,int num);//声明一个函数指针
Class A
{void FuncA(){m_callBackFunc(m_Ptr,num_A);}void SetCallBack(CallbackFunc callback,void *pthis){m_callBackFunc = callback;m_Ptr = pthis;}CallbackFunc m_callBackFunc;void* m_Ptr;int num_A;
}Class B
{static bool FuncB(void *pVoid,int tmpNum){print<<pVoid->m_num;m_num = tmpNum;print<<pVoid->m_num;}void Run(){m_a.SetCallBack(FuncB,this);m_a.FuncA();}
public:A m_a;int m_num;
}//调用
main()
{B b;b.m_num = 2;b.Run();
}
c++类的成员函数作回调函数为啥要声明为static的相关推荐
- C++类成员函数作回调函数
前面写了一篇文章 C语言消息注册派发模式 介绍了下我理解的C语言消息派发.因为C语言是函数式语言,写回调函数的时候很简单 参数就是一个简单的函数指针就好了, 那在C++里的时候 就有些不一样了,虽然C ...
- 将类的成员函数作为回调函数(外一篇:友元函数)
转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题: 回调函数是基于C编程的Windows SDK的技 ...
- 如何定义和实现一个类的成员函数为回调函数
如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++ ...
- C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)
C++中 线程函数为静态函数 及 类成员函数作为回调函数 线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运 ...
- boost::regex模块在 cpp 文件中搜索类定义,使用全局回调函数的测试程序
boost::regex模块在 cpp 文件中搜索类定义,使用全局回调函数的测试程序 实现功能 C++实现代码 实现功能 boost::regex模块在 cpp 文件中搜索类定义,使用全局回调函数的测 ...
- JavaScript高级day01-PM【对象、函数、回调函数、IIFE、this、关于语句分号问题、webstorm代码模板、复习】
笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目 录 P7 07.尚硅谷_JS高级_对象 23:30 1. 什么是对象? 2. 为什么 ...
- java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数
在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...
- php变量函数,回调函数
一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 {for($i=0;$i<$num;++$i){if($n($i)){echo $ ...
- C++ 实现把非静态成员函数作为回调函数(非static)
众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它. 通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样 ...
最新文章
- 磁盘文件读写和数据库读写哪个效率更高
- Docker image Introduce
- 【转】C# Stream篇(—) -- Stream基类
- Rectangle 属性
- python_机器学习(一)、基本概念
- IronPython for ASP.NET 部署注意事项
- 一个很好的String组合连接的方法(StringBuffer)
- 推荐6个实用的Vue模板
- 计算机专业实习日记,计算机专业实习日记精选
- 三坐标检测之测量基准面的选择
- 视觉SLAM:一直在入门,从未到精通
- 向excel里面插入网络图片
- 正则表达式的字符串匹配
- mysql+uuid的数据类型_mysql 数据类型
- 用计算机弹坚雷抒情版,伤痕坚盾与刃尖奔雷,《明日方舟》全新重装干员“坚雷”向您报道...
- iOS7适配问题总结
- as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5GbE的NAS-华芸AS-5202T测评体验
- MySQL数据库(三)——数据库配置管理
- stm32板间串口通信escape协议
- 【Vsftpd】Vsftpd启动报错