#include #include using std::string; using std::make_shared; class Figure { public: explicit Figure(const string& type) : t(type) {} virtual string Name() const = 0; virtual double Perimeter() const = 0; virtual double Area() const = 0; const string t; }; class Triangle : Figure { private: int a, b, c; public: Triangle(const int& a, const int& b, const int& c) : Figure("TRIANGLE"), a(a), b(b), c(c) {} string Name() { return t; } double Perimeter() { return static_cast(a + b + c); } double Area() { double p = Perimeter() / 2; return sqrt(p * (p - a) * (p - b) * (p - c)); } }; class Rect : Figure { private: int a, b; public: Rect(const int& a, const int& b) : Figure("TRIANGLE"), a(a), b(b) {} string Name() { return t; } double Perimeter() { return 2 * (a + b); } double Area() { return a * b; } }; class Circle : Figure { private: int r; public: explicit Circle(const int& r) : Figure("TRIANGLE"), r(r) {} string Name() { return t; } double Perimeter() { return r * 6.28; } double Area() { return r * r * 3.14; } }; std::shared_ptr
CreateFigure(std::istringstream stream) { std::shared_ptr
res; string figure; stream >> figure; if (figure == "TRIANGLE") { int a, b, c; stream >> a >> b >> c; res = make_shared(a, b, c); } else if (figure == "RECT") { int a, b; stream >> a >> b; res = make_shared(a, b); } else if (figure == "CIRCLE") { int r; stream >> r; res = make_shared(r); } return res; }