2012-11-02 71 views
1

我正在做一個項目,其中我有一個Square類,這是Shape子類無法訪問父類的變量

的子類,但我的程序崩潰時,子類嘗試從父類訪問變量。

這裏是我的代碼:

class Shape2D 
{ 
public: 
    string shape; 
    void setShape(string newShape); 
    string getShape(); 

    string specialType; 
    void setSpecialType(string newSpecialType); 

    vector <int> shapeXCoordi; 
    void setshapeXCoordi(int newshapeXCoordi); 

    vector <int> shapeYCoordi; 
    void setshapeYCoordi(int newshapeYCoordi); 
    void toString(); 

    virtual int computeArea() 
    { 
     return 0; 
    } 
    void displayArea(); 
}; 

出於測試目的,我只能讓這個computeArea()返回x座標。

class Square : public Shape2D 
{ 
public: 
    int computeArea() 
    { 
     return shapeXCoordi[0]; 
    } 
}; 

int main() 
{ 
    if (aShape2D[0].getShape() == "Square") 
    { 
     Shape2D *pShape2D; 
     pShape2D = &aSquare; 

     cout << "Area: " << pShape2D -> computeArea() << endl; 
    } 
} 

我做了幾個測試,如果我改變return shapeXCoordi[0];return 123;,它工作正常。

我也試過return shape;但它不會顯示任何東西,雖然這次它不會崩潰。

所以我猜有什麼不對,當SquareClass試圖訪問從ShapeClass

shapeXCoordi[0]

任何人都可以見識一下這種情況呢?

+1

這可能與繼承無關。你如何初始化'aShape2D',以及如何初始化'shapeXCoordi'? – Mankarse

+0

我在我的主體中有一個'Shape2D aShape2D [100]',因此我可以存儲多達100個形狀。至於shapeXCoordi,它是一個矢量,它存儲形狀的每個頂點的x座標,在這種情況下,一個正方形 – user1793001

+0

這是由於我有一個Shape2D數組,因此當我調用shapeXCoordi [0 ]它不知道要查看哪個形狀的shapeXCoordi [0]? – user1793001

回答

0

您需要通過先調用setshapeXCoordi來初始化構造函數中的shapeXCoordi。由於您正在訪問shapeXCoordi,一個未初始化的矢量,因此它中沒有任何元素。因此,當你使用[0]訪問它時,它會返回一個錯誤。

您可以添加一個全面的檢查,以computeArea(),以確保有在shapeXCoordi元素訪問之前:

int computeArea() 
{ 
    assert(shapeXCoordi.size() != 0); 
    return shapeXCoordi[0]; 
} 

另外,我建議使用.AT(0),而不是[0],這樣你可以得到實際的錯誤處理而不是崩潰。