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;,但它不会显示任何东西,虽然这一次,它不会崩溃。

所以我猜想SquareClassshapeXCoordi[0]ShapeClass

任何人都可以在这种情况下启发我吗?

4

1 回答 1

0

您需要先调用 setshapeXCoordi 在构造函数中初始化 shapeXCoordi。由于您正在访问 shapeXCoordi(一个未初始化的向量),因此其中没有任何元素。因此,当您使用 [0] 访问它时,它会返回错误。

您可以向 computeArea() 添加完整性检查,以确保在访问之前 shapeXCoordi 中有一个元素:

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

此外,我建议使用 .at(0) 而不是 [0],这样您可以获得实际的错误处理而不是崩溃。

于 2012-11-06T21:22:38.373 回答