靜態成員函式不可以訪問類中的成員變數
阿新 • • 發佈:2019-01-04
原因:因為靜態成員函式在類物件構造時沒有分配this指標(非靜態成員函式則具有this指標),相當於是全域性函式,是屬於類的,而類的成員變數只有類物件(例項)能夠訪問,成員變數只有例項化才有意義。
解決辦法:靜態成員函式增加一個類的指標或引用作為引數。如
class Foo
{
int m_f;
public:
static void f()
{
m_f=666; //這是非法的,這個等價於this->m_f=666,而靜態方法沒有this
}
static void f(Foo&a)
{
a.m_f=666 ; //這樣就可以
}
};
呼叫靜態成員函式無需傳入物件指標的辦法
通過map儲存類物件
typedef map<int,A*> CAMAP;
class A()
{
public:
static void func(); //靜態成員函式
private:
int m_ID; //本物件在列表中的ID號
static CAMAP m_Map; //物件對映表,靜態
float value; //非靜態成員變數
float func1(); //非靜態成員函式
};
CAMap A::m_Map; //預設構造map
A::A() //將物件儲存至m_Map中
{
if(m_Map.IsEmpty())
{
m_ID=0;
}
else
{
m_ID=m_Map.size()+1;
}
m_Map.insert(make_pair<int,A*>(m_ID,this));
}
A::~A() //將物件從m_Map中刪除
{
m_Map.erase(m_ID);
}
void A::func()
{
if (m_Map.IsEmpty())
return ;
A* pThis = m_Map[m_ID]; //獲取當前物件指標
if( pThis != NULL)
{
pThis->value = pThis->b(); //呼叫非靜態函式成員
}
}