2013-04-06 111 views
1

我有以下設置:無法訪問靜態方法中的私有類成員?

//.h 
class Cell 
{ 
private: 
    POINT mCellStartingPoint; 
    int  mXoffset; 
    int  mYoffset; 
public: 
    static void DrawRowOfPixels(int yoff); 
    Cell(); 
    ~Cell(); 
}; 

//.cpp 
void Cell::DrawRowOfPixels(int yoff) 
{ 
    HDC dc = GetDC(NULL); 
    COLORREF red = 0xFF0000; 
    for(int i = mCellStartingPoint.x; i < mXoffset; i++) 
    { 
     SetPixel(dc, mCellStartingPoint.x + i, mCellStartingPoint + yoff, red); 
    } 
} 

然而,在實施DrawRowOfPixels時()在.cpp文件的方法,我在所有的細胞類的成員變量的出現錯誤。 (即mCellStartingpoint,mXoffset和mYoffset)

error C2228: left of '.x' must have class/struct/union

error C2597: illegal reference to non-static member 'Cell::mXoffset'

error C3867: 'Cell::mXoffset': function call missing argument list; use '&Cell::mXoffset' to create a pointer to member

error: A nonstatic member reference must be relative to a specific object

我知道我可能做一些非常愚蠢的,但是這是怎麼回事呢?爲什麼我不能在我的靜態成員函數中使用我的私有成員變量,就像我應該能夠的那樣?

+0

靜態成員函數不能訪問非靜態數據成員是合乎邏輯的原因。它是靜態成員函數定義的一部分。 – chris 2013-04-06 05:19:20

+3

如果你有一個**對象**與這些數據成員一起使用,它可能會非常有幫助。您正在使用靜態類功能。它沒有任何對象,因此沒有成員。使函數成爲非靜態函數,將參數傳遞爲參數,或者使成員靜態。以上任何一項都可以工作。選擇合適的人來滿足你的需求。 – WhozCraig 2013-04-06 05:20:07

+0

所以我幾乎無法訪問它們呢?我認爲靜態函數的要點是能夠在沒有對象的情況下被調用,但仍然具有與被對象調用相同的用途。 – xcdemon05 2013-04-06 05:21:26

回答

12

您不能訪問非靜態成員一個static方法,除非你明確地使成員函數內部可用的對象實例內。(通行證對象實例明確的參數,或者使用可以在功能內被訪問的全局實例)

對於非靜態成員函數,隱式指針被作爲函數的第一個參數傳遞給參數thisthis指針在成員函數內部被取消引用以訪問成員。 static成員不會通過隱含的this指針傳遞,因此您無法訪問該函數內的非靜態成員,除非您在成員函數內顯式獲取該對象。

相關問題