我们知道,普通成员函数隐藏这一个this指针,所以可以去调用类中别的成员函数和成员变量。静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于某个对象,静态函数的创建要早于非静态函数和成员变量,静态函数中的member可能都没有分配内存。此外,静态成员函数没有隐含的this自变量。所以,它就无法访问自己类的非静态成员。
那么如何调用呢?
我们可以显示的传入对象指针,如下:
class Demon1
{
public:
static void FunctionA(Demon* p)
{
p->menber = 1;
}
private:
int menber;
}
前提是这个类要分配了内存空间。其实这里就是将一个对象指针作为静态成员函数的“this”指针,意在模仿传递非静态成员函数里this变量。
下面再举一个类中含有线程函数的例子:
类中的线程函数必须为静态成员函数,因为线程函数是全局的。当静态成员函数作为线程函数时,最好传一个空指针,然后进行强制转换。
class Demon2
{
public:
//线程函数
static void __stdcall ThreadFun(void* p)
{
try
{
if (p)
{
Demon1 * pThis = (Demon1 *)(p);
pThis->menber =1;
}
}
catch (...)
{
return -1;
}
return 1;
}
// 开启线程函数
int StartThread(void)
{
if (NULL == m_hThread)
{
m_bThread = true;
m_hThread = (void *)_beginthreadex(NULL, 0, m_hThread, this, 0, NULL);
if (NULL == m_hThread)
{
m_bThread = false;
return -1;
}
}
return 1;
}
//关闭线程函数,一般在析构函数中
int StopThread(void)
{
if (m_bThread)
{
m_bThread = false;
DWORD n = WaitForSingleObject(m_hThread, INFINITE);
if (WAIT_OBJECT_0 != n)
{
cout << "WaitForSingleObject fail"<<endl;
}
CloseHandle(m_hThread);
m_hThread = NULL;
}
return IMVS_EC_OK;
}
private:
int menber;
void* m_hThread;
bool m_bThread;
}