C++ 向数组中添加类
我正在做一项大学作业,关于使用OOP查找不同形状的数组。 我已经创建了所有的shape类,因此它们都是从我的主shape类派生的。Shape类被用作接口,因此从Shape类派生的所有Shape类都必须具有计算面积函数等。 我想创建一个不同形状的数组。我已经声明了一个数组,它的形状类型是父类,我想在数组列表中添加每个不同形状、圆形、方形、矩形和三角形的新实例,以便将每个形状的所有信息存储在一个数组中。我有下面的代码,但在aShapes[I]=square行上有一个错误表示形状是无法接近的正方形底部 如果有人能帮忙,那就太好了 提前谢谢 这是我的密码C++ 向数组中添加类,c++,C++,我正在做一项大学作业,关于使用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];
这很好地解决了问题:AShape*
可以指向A、2,并且所有的Shape*
本身都是相同的类型
然后在主代码中,存储数组中对象的地址:
aShapes[i] = □
您需要对现有代码进行一些其他更改以使其正常工作:
- 使用
- 使
中的方法虚拟化Shape
- 将
中覆盖由Square
定义的接口的方法设置为publicShape
- 添加
1如果您确实设法将
形状的子代复制到数组中,则最终会失败
2技术性:如果您提供Shape
方法,则无法创建纯Shape
的实例。在这种情况下,Shape*
无法指向Shape
的实例,因为您无法创建一个!Shape*
只会指向它的一个实现所有虚拟方法的后代。数组不是多态的:数组中存储的所有内容都必须是相同的类型。你的形状数组
无法工作。1
那么,在使用数组时,如何获得多态性呢?将数组更改为存储指向形状的指针
:
Shape *aShapes[5];
这很好地解决了问题:AShape*
可以指向A、2,并且所有的Shape*
本身都是相同的类型
然后在主代码中,存储数组中对象的地址:
aShapes[i] = □
您需要对现有代码进行一些其他更改以使其正常工作:
- 使用
- 使
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];