【问题标题】:Subclass unable to access parent class' variable子类无法访问父类的变量
【发布时间】:2023-04-01 14:11:02
【问题描述】:

我正在制作一个程序,其中我有一个 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] 时出现问题

谁能告诉我这种情况?

【问题讨论】:

  • 这可能与继承无关。你是如何初始化aShape2D的,你是如何初始化shapeXCoordi的?
  • 我的主目录中有一个“Shape2D aShape2D[100]”,我可以存储多达 100 个形状。至于 shapeXCoordi,它是一个向量,用于存储形状的每个顶点的 x 坐标,在这种情况下,是一个正方形
  • 是不是因为我有一个 Shape2D 数组,所以当我调用 shapeXCoordi[0] 时,它不知道要查看哪个形状的 shapeXCoordi[0]?

标签: c++ pointers inheritance virtual-functions


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-12-04
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 2020-02-13
    • 2021-09-28
    相关资源
    最近更新 更多