静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存。静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。但我们在一个class中要使用CreateThread,并且需要在这个开启的线程中处理类的非静态成员变量的时候,因为CreateThread需要入口函数的地址,因此要进入类的成员函数时要求这个类成员函数是static的。那我们需在类的静态成员函数中访问非静态成员变量该怎么办呢?
一种方法是如下:
int menber;
//将上一行的非静态成员变量改写成下面所示的静态成员变量:
static int menber;
这种方法要求我们把所有要访问的成员变量都改成静态的,这样不仅不方便,而且会要求我们对类的静态成员显示初始化。有没有更好的办法呢?我们可以用给静态成员函数传递类的指针的方法来解决这个问题。方法如下:
前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在作为传递非静态成员函数里this变量使用(在非静态成员函数中都有this指针(似乎push在ECX中))。这样,我们调用了newThread()函数后,里面新建的线程可以运行类的静态成员函数,而且通过将本对象的指针传递到这个静态成员函数里,这个函数也可以通过本对象的指针访问类的非静态成员变量。
class a
{
public:
static FunctionA(a* _a)
{
_a-> menber = 1;
cout<<_a-> menber<<endl;
_a->f();
}
void f()
{
cout<<"f被调用了"<<endl;
}
void newThread()
{
HANDLE hnd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FunctionA,this,0,0);
}
private:
int menber;
};
前提是这个类要分配了内存空间。其实这里我做的就是将一个对象指针作为静态成员函数的“this”指针,意在作为传递非静态成员函数里this变量使用(在非静态成员函数中都有this指针(似乎push在ECX中))。这样,我们调用了newThread()函数后,里面新建的线程可以运行类的静态成员函数,而且通过将本对象的指针传递到这个静态成员函数里,这个函数也可以通过本对象的指针访问类的非静态成员变量。