刚入坑c++ 求救 关于多态的

定义一个具有多态性的基类Shape,继承以下一些类:圆Circle类(坐标点和半径构成),长方形 Rectangle类(两个不重合的坐标点构成),三角形 Triangle类(三个互不重合的坐标点构成)。 定义一些操作, 特别是定义求面积操作 。
编制应用程序, 按文件内容创建各类对象, 放在 Shape指针向量中 。
循环处理向量中的每个元素,求其面积。若为圆,则还要输出其半径(输出半径不是求面积的职能, 应另设 get成员实现之, 它不是虚函数)。
shape.txt文件内容如下:

在这里插入图片描述
若第一字符为’C’,则后面为圆数据: x坐标、 y坐标、圆半径三个实数。若第一字符为’R’,则后面为长方形数据: x1、 y1、 x2、 y2坐标。若第一字符为’T’,则后面为三角形数据: x1、 y1、 x2、 y2、 x3、 y3坐标。若第一字符为’X’,表示输入结束。
#include
#include
#include
#include
#include
#include
using namespace std;
class point
{
public:
point(double xx = 0,double yy=0):x(xx),y(yy){}
double getX() { return x; }
double getY() { return y; }
private:
double x;
double y;
};
class shape
{
public:
virtual double area() = 0;
};
class circle:public shape
{
public:
circle(double x=0,double y=0,double R=0):center(x,y),r®,PI(3.14){}
double area()
{
return PI * rr;
}
double getR()
{
return r;
}
private:
point center;
double r;
const double PI;
};
class rectangle:public shape
{
public:
rectangle(double x1=0,double y1=0,double x2=0,double y2=0):p1(x1,y1),p2(x2,y2){}
double area()
{
double l = abs(p1.getX()-p2.getX());
double w = abs(p1.getY()-p2.getY());
return w * l;
}
private:
point p1;
point p2;
};
class triangle :public shape
{
public:
triangle(double x1 = 0, double y1 = 0, double x2 = 0, double y2 = 0, double x3 = 0, double y3 = 0) :p1(x1, y1), p2(x2, y2), p3(x3, y3) {}
double distance(point &p1, point &p2)
{
double a = sqrt(pow(p1.getX() - p2.getX(), 2) + pow(p1.getY() - p2.getY(), 2));
return a;
}
double area()
{
double p = (distance(p1, p2) + distance(p1, p3) + distance(p2, p3)) / 2;
return sqrt(p
(p - distance(p1, p2))(p - distance(p1, p3))(p - distance(p2, p3)));
}
private:
point p1;
point p2;
point p3;
};
void readdata(string file, vector<shape > &v)
{
ifstream infile(file.c_str());
string s;
while (getline(infile, s))
{
istringstream ins(s);
char ch;
double r,x1, x2, x3, y1, y2, y3;
ins >> ch;
switch (ch)
{
case ‘C’:
ins >> x1 >> y1 >> r;
v.push_back(new circle(x1, y1, r));
break;
case ‘T’:
ins >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
v.push_back(new triangle(x1, y1, x2, y2, x3, y3));
break;
case ‘R’:
ins >> x1 >> y1 >> x2 >> y2;
v.push_back(new rectangle(x1, y1, x2, y2));
break;
case ‘X’:
break;
}
}
for (unsigned int i=0;i<v.size();i++)
cout << “area=” << v[i]->area() << endl;
//if (dynamic_cast<circle
>(v[i]))
for (unsigned int i = 0;i< v.size(); i++)
delete v[i];
}
int main()
{
string s=“shape”;
vector<shape *> v;
readdata(s, v);
system(“pause”);
return 0;
}
这是我自己写的代码,我用的是vs2017,运行之后没有结果
在这里插入图片描述
请求大佬们帮忙看下 该怎么改 感谢

猜你喜欢

转载自blog.csdn.net/l_z1120/article/details/85036658
今日推荐