【发布时间】:2021-08-21 04:45:02
【问题描述】:
我想输入形状的数量和形状的面积之和。
第一行输入要计算的形状数量,第一行之后可以输入形状的类型,形状的大小。
但是我在计算三角形和矩形的面积时遇到了问题,除了圆形。只有圆的面积计算得很好..
$ ./a.out
1
R 2.0 1.0
0.00
$ ./a.out
1
T 2.0
0.00
$ ./a.out
1
C 1.0
3.14
我认为问题来自
for (int i = 0; i < n ; i++)
{
sum += collection[i]->area(collection);
}
这段代码!我认为我的面积函数只计算向量的第一个元素.....
#include <iostream>
#include <iomanip>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
class Shape{
protected:
int _r;
int _w;
int _h;
public:
Shape(double r) : _r(r) {}
Shape(double w, double h) : _w(w), _h(h) {}
virtual double area(vector<Shape *>) = 0;
};
class Circle : public Shape{
public:
Circle(double r) : Shape(r) {}
double area(vector<Shape *>) { return _r*_r*atan(1)*4.0; }
};
class Triangle : public Shape{
public:
Triangle(double s) : Shape(s) {}
double area(vector<Shape *>) { return sqrt(3) * pow(_r, 2) / 4; }
};
class Rectangle : public Shape{
public:
Rectangle(double w, double h) :Shape(w, h) {}
double area(vector<Shape *>) { return _w * _h ;}
};
int main()
{
int n;
char info;
int value;
int value2;
double sum;
vector<Shape*> collection;
vector<int> answer;
sum = 0;
cin >> n;
for(int i = 0 ; i < n + 1; i++)
{
cin >> info;
if (info == 'C')
{
cin >> value;
Circle c(value);
collection.push_back(&c);
}
else if (info == 'R')
{
cin >> value;
cin >> value2;
Rectangle r(value, value2);
collection.push_back(&r);
}
else
{
cin >> value;
Triangle t(value);
collection.push_back(&t);
}
}
for (int i = 0; i < n + 1 ; i++)
{
sum += collection[i] -> area(collection);
}
cout << fixed << setprecision(2) << sum << endl;
}
【问题讨论】:
-
您的代码doesn't compile。你不能推回
area,因为它不是Shape*的函数。 -
尝试推送
Shape的副本而不是指针。因为在push_back之后您的所有输入都超出了范围。 -
您创建形状,将其地址推入向量中,当您到达范围的末尾时,您的对象被销毁,但地址在向量中保持不变,指向垃圾。这就是所谓的悬空指针。
-
@LouisGo:
Shape是纯虚拟的,因此std::vector<Shape>无效。 -
已经有 std::accumulate 用于此目的