我正在处理有关使用OOP查找不同形状的数组的大学作业。
我已经创建了所有形状类,因此它们是从我的主要形状类派生的。形状类的使用就像一个界面,因此从形状类派生的所有形状类都必须具有计算面积函数,等等。
我想创建一个不同形状的数组。我已经声明了一种形状为形状的数组,这是父类,我想向数组列表中添加每个不同形状,圆形,正方形,矩形和三角形的新实例,以便将有关每个形状的所有信息存储在一个数组。我有以下代码,但是我在aShapes [i] = square线上出错。说形状是无法接近的正方形基础。
如果有人可以帮忙,那将是很棒的。
先谢谢了。
这是我的代码
#include <cstdlib>
#include <iostream>
#define M_PI 3.14159265358979323846
using namespace std;
class Shape{
public:
string sName;
float nArea;
void fnAddData();
float fnCalculateArea();
};
class Square : private Shape {
private:
float nSide;
void fnAddData()
{
cout << "Please enter the length of a side: ";
cin >> nSide;
}
float fnCalculateArea(float side)
{
return (side * side);
}
public:
Square()
{
sName = "Square";
fnAddData();
nArea = fnCalculateArea(nSide);
}
};
Shape aShapes[5];
/*
*
*/
int main(int argc, char** argv)
{
int decision;
Square square;
for (int i = 0; i < 5; i++)
{
cout << "Shape number";
cin >> decision;
switch (decision)
{
case 1:
aShapes[i] = square;
}
}
return 0;
}
最佳答案
数组不是多态的:数组中存储的所有内容都必须是同一类型。您的Shape
数组不起作用。1
那么,如何在使用数组时获得多态呢?更改您的数组以存储指向Shape
的指针:
Shape *aShapes[5];
这就很好地解决了这个问题:一个
Shape*
可以指向一个Shape
or any of its descendants,2,并且所有Shape*
本身都是同一类型。然后在您的主代码中,将对象的地址存储在数组中:
aShapes[i] = □
您需要对现有代码进行其他几处更改才能使此工作:
使用public inheritance, not private inheritance。
将
Shape
中的方法设为虚拟。将覆盖
Square
定义的接口的Shape
中的方法设为公共。添加virtual destructor.
1如果确实设法将
Shape
的后代复制到阵列中,则最终为slicing the object。2技术性:如果提供
Shape
pure virtual方法,则将无法创建纯Shape
的实例。在这种情况下,Shape*
不能指向Shape
的实例,因为您不能创建一个实例! Shape*
仅指向实现所有虚拟方法的后代之一。关于c++ - 向数组添加类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20705788/