2012-11-02 69 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],这样你可以得到实际的错误处理而不是崩溃。