我正在创建一个程序,我有一个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
尝试从shapeXCoordi[0]
ShapeClass
时出现问题
任何人都可以在这种情况下启发我吗?
答案 0 :(得分:0)
您需要先通过调用setshapeXCoordi来初始化构造函数中的shapeXCoordi。由于您正在访问未初始化的vectorXCoordi,因此其中没有元素。因此,当您使用[0]访问它时,它会返回错误。
您可以在computeArea()中添加一个完整性检查,以确保在访问shapeXCoordi之前有一个元素:
int computeArea()
{
assert(shapeXCoordi.size() != 0);
return shapeXCoordi[0];
}
另外,我建议使用.at(0)而不是[0],这样你就可以获得实际的错误处理而不是崩溃。