【发布时间】:2020-11-14 10:02:32
【问题描述】:
#include <iostream>
#include <fstream>
using namespace std;
class Shape
{
public:
string name;
double width, height, radius;
public:
void set_data (double a, double b)
{
width = a;
height = b;
}
virtual double area() = 0;
};
class Rectangle: public Shape
{
public:
double area ()
{
return (width * height);
}
};
class Triangle: public Shape
{
public:
double area ()
{
return (width * height)/2;
}
};
class Circle : public Shape
{
public:
double area ()
{
return 3.1415 * (radius * radius);
}
};
int main()
{
int N;
cin >> N;
Rectangle Rect;
Triangle Tri;
Circle Circ;
string* S = new string[N];
if(N == 1) {
cin >> Rect.name >> Rect.height >> Rect.width;
cout << Rect.area();
return 0;
}
else
{
for(int i = 0; i < N; i++)
{
cin >> S[i];
if(S[i] == "Rectangle")
{
cin >> Rect.height;
cin >> Rect.width;
}
else if(S[i] == "Triangle")
{
cin >> Tri.height;
cin >> Tri.width;
}
else if(S[i] == "Circle")
{
cin >> Circ.radius;
}
}
}
cout << Rect.area() << " " << Tri.area() << " " << Circ.area();
delete [] S;
return 0;
}
代码在测试 1 和测试 2 中运行良好,但在测试 3 中出现错误... 我需要输入 N 个数字(形状的计数)并按升序显示在输出所有区域中...
例如:
====== 测试#1 =======
输入:
1
矩形 4 3
输出: 12
真正的答案: 12
好的!
====== 测试#2 =======
输入:
3
三角形 4 6
矩形 2 3
第 3 圈
输出: 6 12 28.2735
真正的答案: 6 12 28.2735
好的!
====== 测试#3 =======
输入:
5
三角形 4 6
矩形 2 3
第 4 圈
三角形 7 11
三角形 3 5
输出: 6 7.5 50.264
真正的答案: 6 7.5 12 38.5 50.264
错误!
请告诉我,为什么我的代码不起作用?
【问题讨论】:
-
好吗?你知道如何让程序对事物进行排序吗?
-
在容器中存储指针或引用(例如
std::vector),并将std::sort与适当的lambda(例如[](Shape& a, Shape& b) { return a.area() < b.area(); })一起使用?顺便说一句,更好的签名:virtual double area() const = 0;。不要忘记override关键字。 -
不知道怎么解决
-
另外,从设计的角度来看,抽象形状不应该有宽度、高度或半径。这些概念不适用于此级别。你的矩形没有半径,你的圆没有宽度和高度(本身)。
标签: c++ function class inheritance virtual