this指针之我解

上面有博文已经分析过一件事,现在扩展一下,顺带提下this指针

 
class Test
{
   void callBackFun()
   {
   }
};
void main(void)
{
  Test::callBackFun();//非法,即使调用函数无需实例化,这样的直接调用也是不被允许的,因为参数       不够,参数表里还需一个(Test* this)
Test* test;
test->callBackFun();//合法,这里显然传入的this指针即为test,因test未指向任何值,故只能调       函数,取成员变量时即出错
 
Test test_valid;
test=&test_valid;
test->callBackFun();//合法且正确的调用
 
}
 
将函数改为显式使用this
void callBackFun()
   {
this->a=0;//callBackFun默认有一个const Test* this的指针
   }
若需要回调,则出现以下情况:
class Test
{
public:
 
    void callBackFun(void){}; //因为callBackFun默认有一个const Test* 的指针
};
typedef void (*FPtr)(void);
void Fun(FPtr ptr)
{
    ptr();
}
 
void main(void)
{
    Fun(Test::callBackFun); 
}
显然的,这里直接调用是非法的。这种通过函数指针进行的调用似乎无能为力了,因为无法取得指向某一个实例的函数的函数指针,所以只能通过static 解决。如先看如何全局调用:
class Test
{
    static void callBackFun(void){}; //无需this指针传入
};
typedef void (*FPtr)(void);
void Fun(FPtr ptr)
{
    ptr();
}
void main(void)
{
//Test::callBackFun();//这样的调用是合法的,因为无须this指针
Fun(Test::callBackFun); //所以,可以改成这种调用
}
以上代码,由于static函数只能调用static成员,故这里的static函数失去了类内调用成员的好处,为了实现这种状况,先研究一下下面的例子:
 
class Test
{
public:
static void callBackFun()
{
printf("pthis->test_mem is %d",test_mem);
}; 
private:
int test_mem;
};
 
void main(void)
{
Test* pthis;
Test test;
pthis=&test;
//pthis->test_mem=100;//类外调用private,非法
pthis->callBackFun();
}
以上就属于static调用非static成员,故出错,非法,改成以下:
class Test
{
public:
static void callBackFun(Test* pthis)
{
printf("pthis->test_mem is %d",pthis->test_mem);
};
 
private:
int test_mem;
};
void main(void)
{
Test* pthis;
Test test;
pthis=&test;
pthis->callBackFun(pthis);//合法,手工传入Test* this,后在Test类内用static函数调用,此也即非static     的成员函数调用成员变量的隐式方法
 
}
 
最后,是如何在回调中使用static函数访问非static的成员变量,以下代码只能在vs中运行,VC6在构造函数中无法对static变量进行初始化
#include <iostream>
class Test
{
public:
Test();
static Test*s_this;
static void callBackFun()
{
s_this->test_mem=10000;
printf("s_this->test_mem is %d\n",s_this->test_mem);
 
}; 
private:
 
int test_mem;
 
};
 
 
Test* Test::s_this=0;//这里是类外静态变量赋值,只能这么赋,注意类运算符的位置
 
Test::Test()//在构造函数里将this给静态成员变量
{
s_this=this;
test_mem=0;
}
typedef void (*FPtr)(void);
void Fun(FPtr ptr)
{
ptr();
}
void main(void)
{
Test* pthis;
Test test;//一定要定义一个对像,才会调用他的构造函数
Fun(Test::callBackFun); 
}
posted @ 2013-01-11 23:11  yurius  阅读(176)  评论(0编辑  收藏  举报