2013-03-28 599 views
3

我不明白爲什麼視圖給了我一個非靜態成員引用的錯誤必須是相對於特定對象。錯誤:非靜態成員引用必須是相對於特定對象

CDrawView::Shape是,我已經宣佈枚舉我CDrawView

enum shape{line, rect, elli}; 
shape current_shape; 

這是我的其他類

class Shapemaker 
{ 
public: 

    CDrawView view; 
    static void Create(CDrawView::shape) 
    { 
     if(view.current_shape == view.line) 
     { 
      view.m_shape.reset(new Line()); 
     } 
     else if(view.current_shape == view.rect) 
     { 
      view.m_shape.reset(new Rect()); 
     } 
    } 
} 

什麼是最好的做法,以避免這個錯誤

+3

您需要了解靜態和非靜態成員之間的區別。基本的解決方案是(a)讓你的成員函數是非靜態的,或者(b)使你的成員變量是靜態的。 –

回答

4

首先,由於該功能是static,因此它無權訪問view。這是因爲viewShapemaker的非靜態成員,因此只與特定實例相關聯Shapemaker。要麼view需要是staticCreate函數不應該。另一種選擇是view不應該是成員,應該在Create函數中創建。

此外,枚舉常數名稱是CDrawView類的範圍內,並且通過類名等,以便訪問:

if(view.current_shape == CDrawView::line) 

.操作是用於訪問對象的非靜態成員。 view沒有名爲linerect的非靜態成員。

1

view是類CDrawView的非靜態對象,CreateShapeMaker類的靜態功能,也不會有的view例如,如果你沒有構建的ShapeMakerCreate不與ShapeMaker的任何對象相關聯的對象。您不能在靜態成員函數內使用nons-tatic成員。

相關問題