C++ 向数组中添加类

C++ 向数组中添加类,c++,C++,我正在做一项大学作业,关于使用OOP查找不同形状的数组。 我已经创建了所有的shape类,因此它们都是从我的主shape类派生的。Shape类被用作接口,因此从Shape类派生的所有Shape类都必须具有计算面积函数等。 我想创建一个不同形状的数组。我已经声明了一个数组,它的形状类型是父类,我想在数组列表中添加每个不同形状、圆形、方形、矩形和三角形的新实例,以便将每个形状的所有信息存储在一个数组中。我有下面的代码,但在aShapes[I]=square行上有一个错误表示形状是无法接近的正方形底部

我正在做一项大学作业,关于使用OOP查找不同形状的数组。 我已经创建了所有的shape类,因此它们都是从我的主shape类派生的。Shape类被用作接口,因此从Shape类派生的所有Shape类都必须具有计算面积函数等。 我想创建一个不同形状的数组。我已经声明了一个数组,它的形状类型是父类,我想在数组列表中添加每个不同形状、圆形、方形、矩形和三角形的新实例,以便将每个形状的所有信息存储在一个数组中。我有下面的代码,但在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;
}
#包括
#包括
#定义M_PI 3.14159265358979323846
使用名称空间std;
类形状{
公众:
弦圈套;
浮鼻;
void fnAddData();
浮动fn计算earea();
};
阶级广场:私人形状{
私人:
浮雕;
void fnAddData()
{
cout>nSide;
}
浮子A(浮子侧)
{
返回(侧*侧);
}  
公众:
正方形()
{
sName=“Square”;
fnAddData();
nArea=fnearea(nSide);
}        
};
形状为aShapes[5];
/*
* 
*/
int main(int argc,字符**argv)
{
int决策;
正方形;
对于(int i=0;i<5;i++)
{
决策;
转换(决定)
{
案例1:
aShapes[i]=正方形;
}                        
}    
返回0;
}

数组不是多态的:数组中存储的所有内容都必须是相同的类型。你的
形状数组
无法工作。1

那么,在使用数组时,如何获得多态性呢?将数组更改为存储指向
形状的指针

 Shape *aShapes[5];
这很好地解决了问题:A
Shape*
可以指向A、2,并且所有的
Shape*
本身都是相同的类型

然后在主代码中,存储数组中对象的地址:

 aShapes[i] = &square;
您需要对现有代码进行一些其他更改以使其正常工作:

  • 使用
  • 使
    Shape
    中的方法虚拟化
  • Square
    中覆盖由
    Shape
    定义的接口的方法设置为public
  • 添加

1如果您确实设法将
形状的子代复制到数组中,则最终会失败


2技术性:如果您提供
Shape
方法,则无法创建纯
Shape
的实例。在这种情况下,
Shape*
无法指向
Shape
的实例,因为您无法创建一个!
Shape*
只会指向它的一个实现所有虚拟方法的后代。

数组不是多态的:数组中存储的所有内容都必须是相同的类型。你的
形状数组
无法工作。1

那么,在使用数组时,如何获得多态性呢?将数组更改为存储指向
形状的指针

 Shape *aShapes[5];
这很好地解决了问题:A
Shape*
可以指向A、2,并且所有的
Shape*
本身都是相同的类型

然后在主代码中,存储数组中对象的地址:

 aShapes[i] = &square;
您需要对现有代码进行一些其他更改以使其正常工作:

  • 使用
  • 使
    Shape
    中的方法虚拟化
  • Square
    中覆盖由
    Shape
    定义的接口的方法设置为public
  • 添加

1如果您确实设法将
形状的子代复制到数组中,则最终会失败


2技术性:如果您提供
Shape
方法,则无法创建纯
Shape
的实例。在这种情况下,
Shape*
无法指向
Shape
的实例,因为您无法创建一个!
Shape*
只会指向它的一个实现所有虚拟方法的子代。

出现此特定错误的原因是,您使用的是
private
继承,而您看起来确实想使用
public
继承

class Square : public Shape {
               ^^^^^^
另一个问题是多态性只适用于指针或引用。不能将
正方形
放入
形状数组
。它只需将
形状
部分切成
正方形
,并将其放入数组中<代码>形状aShapes[5]不过是一组
形状
——没有
正方形
,没有
三角形
,只有
形状
。您需要的是:

Shape* aShapes[5];
然后,可以将此数组中的指针设置为指向从
形状派生的类型的对象


您还需要将要在派生类中重写的函数设置为虚拟函数。当编译器看到类似于
aShapes[0]->fnCalculateArea()
,然后看到
fnCalculateArea
是一个虚拟函数时,它只会查找
aShapes[0]的对象的动态类型
指向-然后它将看到它是一个
Square
,并调用
Square::fnCalculateArea

出现此特定错误的原因是因为您使用的是
private
继承,而您看起来确实想使用
public
继承

class Square : public Shape {
               ^^^^^^
另一个问题是多态性只适用于指针或引用。不能将
正方形
放入
形状数组
。它只需将
形状
部分切成
正方形
,并将其放入数组中<代码>形状aShapes[5]是否
    virtual ~Shape() = 0 {}
    Shape* aShapes[5];