#include #include #include #include class Figure { public: virtual std::string Name() const = 0; virtual double Perimeter() const = 0; virtual double Area() const = 0; }; class Triangle : public Figure { public: double a; double b; double c; explicit Triangle(int a, int b, int c) : a(a), b(b), c(c) { } virtual const std::string Name() {return "Triangle";} virtual const double Perimetet() {return (a + b + c);} virtual const double Area() { double p = (a + b + c) / 2; double area = sqrt(p * (p - a) * (p - b) * (p - c)); return area; } }; class Rect : public Figure { public: double width; double height; explicit Rect(int width, int height) : width(width), height(height) { } virtual const std::string Name() {return "Rect";} virtual const double Perimetet() {return (2 * (width + height));} virtual const double Area() {return (width * height);} }; class Circle : public Figure { public: double r; explicit Circle(int r) : r(r) { } virtual const std::string Name() {return "Circle";} virtual const double Perimetet() {return (6.28 * r);} virtual const double Area() {return (3.14 + pow(r, 2));} }; template auto CreateFigure(std::istringstream& is) { std::string command; is >> command; if (command == "RECT") { double width; double height; is >> width >> height; return std::make_shared(width, height); } return 0; /*if (command == "TRIANGLE") { double a; double b; double c; is >> a >> b >> c; return std::make_shared(a, b, c); } if (command == "CIRCLE") { double r; is >> r; return std::make_shared(r); }*/ }