#include #include #include #include using std::string, std::shared_ptr, std::istringstream; class Figure { public: virtual string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; }; class Rect: public Figure { public: double a, b; Rect(double a, double b) { this->a = a; this->b = b; } string Name() override { return "RECT"; } double Perimeter() override { return 2.0*a+2.0*b; } double Area() override { return a*b; } }; class Triangle: public Figure { double a, b, c; public: Triangle(double a, double b, double c) : a(a), b(b), c(c) {} string Name() override { return "TRIANGLE"; } double Perimeter() override { return a+b+c; } double Area() override { double p = (a+b+c)/2; return sqrt(p*(p-a)*(p-b)*(p-c)); } }; class Circle: public Figure { double r; public: explicit Circle(double r) : r(r) {} string Name() override { return "CIRCLE"; } double Perimeter() override { return 2*3.14*r; } double Area() override { return 3.14*r*r; } }; shared_ptr
CreateFigure(istringstream &is) { string figure; double a, b, c; is >> figure >> a; switch (figure[0]) { case 'R': is >> b; return shared_ptr
(new Rect(a, b)); break; case 'T': is >> b >> c; return shared_ptr
(new Triangle(a, b, c)); break; case 'C': return shared_ptr
(new Circle(a)); break; } }