简单说明

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的相关推荐

  1. C++类成员函数作回调函数

    前面写了一篇文章 C语言消息注册派发模式 介绍了下我理解的C语言消息派发.因为C语言是函数式语言,写回调函数的时候很简单 参数就是一个简单的函数指针就好了, 那在C++里的时候 就有些不一样了,虽然C ...

  2. 将类的成员函数作为回调函数(外一篇:友元函数)

    转自:http://blog.csdn.net/xylary/article/details/1548596 将类成员函数用做C回调函数 提出问题:  回调函数是基于C编程的Windows SDK的技 ...

  3. 如何定义和实现一个类的成员函数为回调函数

    如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过.通过查询资料发现,其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即"this"指针,C++ ...

  4. C++中 线程函数为静态函数 及 类成员函数作为回调函数(转载)

    C++中 线程函数为静态函数 及 类成员函数作为回调函数 线程函数为静态函数: 线程控制函数和是不是静态函数没关系,静态函数是在构造中分配的地址空间,只有在析构时才释放也就是全局的东西,不管线程是否运 ...

  5. boost::regex模块在 cpp 文件中搜索类定义,使用全局回调函数的测试程序

    boost::regex模块在 cpp 文件中搜索类定义,使用全局回调函数的测试程序 实现功能 C++实现代码 实现功能 boost::regex模块在 cpp 文件中搜索类定义,使用全局回调函数的测 ...

  6. JavaScript高级day01-PM【对象、函数、回调函数、IIFE、this、关于语句分号问题、webstorm代码模板、复习】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P7 07.尚硅谷_JS高级_对象 23:30 1. 什么是对象? 2. 为什么 ...

  7. java 自定义函数的调用_Java/Android中的函数调用回调函数自定义回调函数

    在做Android自定义控件时遇到要自定义回调函数的问题,想想自己还暂时没有那么精深的技术,赶紧返过头回来再重新研究Java中回调函数的问题.然而不幸的是,网上太多杂乱的帖子和博客都是转来转去,而且都 ...

  8. php变量函数,回调函数

    一,变量可以直接传递函数 <?php function demo($num , $n )//$n是个函数 {for($i=0;$i<$num;++$i){if($n($i)){echo $ ...

  9. C++ 实现把非静态成员函数作为回调函数(非static)

    众所周知,C++的类成员函数不能像普通函数那样用于回调,因为每个成员函数都需要有一个对象实例去调用它. 通常情况下,要实现成员函数作为回调函数,一种常用的方法就是把该成员函数设计为静态成员函数,但这样 ...

最新文章

  1. 磁盘文件读写和数据库读写哪个效率更高
  2. Docker image Introduce
  3. 【转】C# Stream篇(—) -- Stream基类
  4. Rectangle 属性
  5. python_机器学习(一)、基本概念
  6. IronPython for ASP.NET 部署注意事项
  7. 一个很好的String组合连接的方法(StringBuffer)
  8. 推荐6个实用的Vue模板
  9. 计算机专业实习日记,计算机专业实习日记精选
  10. 三坐标检测之测量基准面的选择
  11. 视觉SLAM:一直在入门,从未到精通
  12. 向excel里面插入网络图片
  13. 正则表达式的字符串匹配
  14. mysql+uuid的数据类型_mysql 数据类型
  15. 用计算机弹坚雷抒情版,伤痕坚盾与刃尖奔雷,《明日方舟》全新重装干员“坚雷”向您报道...
  16. iOS7适配问题总结
  17. as5300g2 nas软件功能_硬件与软件齐飞,首款支持2.5GbE的NAS-华芸AS-5202T测评体验
  18. MySQL数据库(三)——数据库配置管理
  19. stm32板间串口通信escape协议
  20. 【Vsftpd】Vsftpd启动报错

热门文章

  1. swift实例教程_Swift示例教程基础
  2. scala泛型上边界_Scala类型边界:上边界,下边界和视图边界
  3. 在Objective-C中分类对象和方法
  4. 开课吧课堂:深入了解学习C++的意义与就业方向
  5. 目前人工智能的主要研究方向是哪些?
  6. 企业网站建设注意事项
  7. 开源大数据周刊-第50期
  8. CardView的使用
  9. indexOf() 使用方法(数组去重)
  10. curl实现发送Get和Post请求(PHP)