1. 程式人生 > >靜態成員函式不可以訪問類中的成員變數

靜態成員函式不可以訪問類中的成員變數

原因:因為靜態成員函式在類物件構造時沒有分配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(); //呼叫非靜態函式成員 } }