#pragma once class Figure { public: virtual std::string Name() = 0; virtual double Perimeter() = 0; virtual double Area() = 0; }; class Rect : public Figure { public: Rect(int w, int h) : width(w), height(h) {} std::string Name() override { return "RECT"; } double Perimeter() override { return ((width + height) * 2); } double Area() override { return (width * height); } private: double width, height; }; class Treangle : public Figure { public: Treangle(int a, int b, int c): A(a), B(b), C(c) {} std::string Name() override { return "TREANGLE"; } 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)); } private: double A, B, C; }; class Circle : public Figure { public: Circle(int r) : R(r) {} std::string Name() override { return "CIRCLE"; } double Perimeter() override { return 2 * P * R; } double Area() override { return P * R * R; } private: double R; double P = 3.14; }; auto CreateFigure(std::istringstream & is) { std::string figure_name; is >> figure_name; is >> std::ws; if (figure_name == "RECT") { int a, b; is >> a; is >> std::ws; is >> b; std::shared_ptr
figure; { std::shared_ptrrect = std::make_shared(a, b); figure = rect; } return figure; } else if (figure_name == "TRIANGLE") { int a, b, c; is >> a; is >> std::ws; is >> b; is >> std::ws; is >> c; std::shared_ptr
figure; { std::shared_ptrtreatangle = std::make_shared(a, b, c); figure = treatangle; } return figure; } else if (figure_name == "CIRCLE") { int r; is >> r; std::shared_ptr
figure; { std::shared_ptrcircle = std::make_shared(r); figure = circle; } return figure; } }