#include #include #include const double PI = 3.14; class Figure { public: explicit Figure(const std::string& type) : Type(type) { } virtual std::string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; const std::string Type; }; class Rect : public Figure { public: Rect(const int& width, const int& height) : Figure("RECT"), perimeter(2 * width + 2 * height), area(width * height) { } std::string Name() override { return Type; } double Perimeter() override { return perimeter; } double Area() override { return area; } private: double perimeter; double area; }; class Triangle : public Figure { public: Triangle(const int& x, const int& y, const int& z) : Figure("TRIANGLE") { perimeter = x + y + z; double h_p = perimeter / 2; area = sqrt(h_p * (h_p - x) * (h_p - y) * (h_p - z)); } std::string Name() override { return Type; } double Perimeter() override { return perimeter; } double Area() override { return area; } private: double perimeter; double area; }; class Circle : public Figure { public: explicit Circle(const int& radius) : Figure("CIRCLE"), perimeter(2 * PI * radius), area(PI * radius * radius) { } std::string Name() override { return Type; } double Perimeter() override { return perimeter; } double Area() override { return area; } private: double perimeter; double area; }; std::shared_ptr
CreateFigure(std::istringstream& is) { std::string name; is >> name; if (name == "RECT") { int width, height; is >> width >> height; return std::make_shared(width, height); } else if (name == "TRIANGLE") { int x, y, z; is >> x >> y >> z; return std::make_shared(x, y, z); } else { int radius; is >> radius; return std::make_shared(radius); } }