码迷,mamicode.com
首页 > 其他好文 > 详细

回调函数中调用类中的非静态成员变量或非静态成员函数

时间:2015-08-09 23:53:07      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

有关这方面的问题,首先说一点:

回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员。由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败。

基于上面的理论,如何在类中封装回调函数呢?

回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静态成员函数作为回调函数,这样才能在类中封装回调函数。

但是如果有这样的需求,当触发某一个事件的时候,我想访问类的普通成员函数和普通成员变量,怎么办?首先明确一点,普通的成员函数不能作为回调函数,所以不能在事件触发后直接回调普通成员函数。那么只能有一种办法,当事件触发后,回调类的静态成员函数,然后想办法通过类的静态成员函数访问普通成员函数和普通的成员变量。

注意:类的静态成员函数由于没有this指针,是不能直接访问类的普通成员变量的,也不能访问类的普通成员函数。这里说的是想办法。

 1. 如何让静态函数访问类的非静态成员

声明一静态函数a(),将类实例对象指针做为参数传入

class A()
{
	static void a(A *pThis); //静态函数
	void b();  		 //非静态函数 
};  

void A::a(A *pThis)
{
	pThis->b(); //静态函数中调用非静态函数 
}

  

2. 回调函数中访问非静态成员(这里的回调函数只能是类的静态成员函数)

由于回调函数往往有固定定义,并不接受  A * pThis 参数,如:CALLBACK MyTimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);

【解决方案一】不把对象指针作为静态成员函数的参数,而是作为类的静态成员变量。这样在静态成员函数(已经作为回调函数)中也能够直接访问这个对象指针(通过对象指针操作普通成员变量和普通成员函数)。

class A()
{
  static void a(); //静态回调函数
  void b();  //非静态函数 
  static A * pThis;   //静态对象指针
};  

A * A::pThis=NULL;
A::A()   //构造函数中将this指针赋给pThis,使得回调函数能通过pThis指针访问本对象
{
   pThis=this;
}
void A::a()
{
  if (pThis==NULL) 
	  return;
  pThis->b(); //回调函数中调用非静态函数 
}

  

http://blog.csdn.net/bzhxuexi/article/details/19831667

回调函数中调用类中的非静态成员变量或非静态成员函数

标签:

原文地址:http://www.cnblogs.com/stemon/p/4716468.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!