我正在处理有关使用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] = &square;


您需要对现有代码进行其他几处更改才能使此工作:


使用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/

10-15 06:54