|
@@ -4,8 +4,9 @@
|
|
|
#include <vector>
|
|
|
#include <fstream>
|
|
|
#include <iomanip>
|
|
|
+#include <string>
|
|
|
|
|
|
-#define PI 3.14159265358979323846
|
|
|
+constexpr auto PI = 3.14159265358979323846;
|
|
|
|
|
|
template<class T>
|
|
|
class Point {
|
|
@@ -36,17 +37,20 @@ public:
|
|
|
/// <summary>
|
|
|
/// Get the name of the figure
|
|
|
/// </summary>
|
|
|
- virtual void name() const = 0;
|
|
|
-
|
|
|
- friend std::ostream& operator<<(std::ostream& out, const GeometricFigure<T>& figure) {
|
|
|
- figure.name();
|
|
|
- out << " (perimeter: " << figure.calc_perimeter() << ", area: " << figure.calc_area() << ")";
|
|
|
- return out;
|
|
|
- }
|
|
|
+ virtual std::string name() const = 0;
|
|
|
|
|
|
virtual ~GeometricFigure() = default;
|
|
|
+
|
|
|
+ template<class U>
|
|
|
+ friend std::ostream& operator<<(std::ostream& os, const GeometricFigure<U>& figure);
|
|
|
};
|
|
|
|
|
|
+template<class U>
|
|
|
+std::ostream& operator<<(std::ostream& os, const GeometricFigure<U>& figure) {
|
|
|
+ os << figure.name() << " (perimeter: " << figure.calc_perimeter() << ", area: " << figure.calc_area() << ")";
|
|
|
+ return os;
|
|
|
+}
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// Represents a circle
|
|
|
/// </summary>
|
|
@@ -67,7 +71,7 @@ public:
|
|
|
|
|
|
T calc_area() const override;
|
|
|
T calc_perimeter() const override;
|
|
|
- void name() const override;
|
|
|
+ std::string name() const override;
|
|
|
};
|
|
|
|
|
|
template<class T>
|
|
@@ -81,8 +85,8 @@ T Circle<T>::calc_perimeter() const {
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
-void Circle<T>::name() const {
|
|
|
- std::cout << "Circle";
|
|
|
+std::string Circle<T>::name() const {
|
|
|
+ return "Circle";
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -106,7 +110,7 @@ public:
|
|
|
|
|
|
T calc_area() const override;
|
|
|
T calc_perimeter() const override;
|
|
|
- void name() const override;
|
|
|
+ std::string name() const override;
|
|
|
};
|
|
|
|
|
|
template<class T>
|
|
@@ -121,8 +125,8 @@ T Ellipse<T>::calc_perimeter() const {
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
-void Ellipse<T>::name() const {
|
|
|
- std::cout << "Ellipse";
|
|
|
+std::string Ellipse<T>::name() const {
|
|
|
+ return "Ellipse";
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -149,7 +153,7 @@ public:
|
|
|
|
|
|
T calc_area() const override;
|
|
|
T calc_perimeter() const override;
|
|
|
- void name() const override;
|
|
|
+ std::string name() const override;
|
|
|
};
|
|
|
|
|
|
template<class T>
|
|
@@ -170,8 +174,8 @@ T Triangle<T>::calc_perimeter() const {
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
-void Triangle<T>::name() const {
|
|
|
- std::cout << "Triangle";
|
|
|
+std::string Triangle<T>::name() const {
|
|
|
+ return "Triangle";
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -199,7 +203,7 @@ public:
|
|
|
|
|
|
T calc_area() const override;
|
|
|
T calc_perimeter() const override;
|
|
|
- void name() const override;
|
|
|
+ std::string name() const override;
|
|
|
};
|
|
|
|
|
|
template<class T>
|
|
@@ -217,8 +221,8 @@ T Rectangle<T>::calc_perimeter() const {
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
-void Rectangle<T>::name() const {
|
|
|
- std::cout << "Rectangle";
|
|
|
+std::string Rectangle<T>::name() const {
|
|
|
+ return "Rectangle";
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
@@ -239,7 +243,7 @@ public:
|
|
|
|
|
|
T calc_area() const override;
|
|
|
T calc_perimeter() const override;
|
|
|
- void name() const override;
|
|
|
+ std::string name() const override;
|
|
|
};
|
|
|
|
|
|
template<class T>
|
|
@@ -279,6 +283,6 @@ T Polygon<T>::calc_perimeter() const {
|
|
|
}
|
|
|
|
|
|
template<class T>
|
|
|
-void Polygon<T>::name() const {
|
|
|
- std::cout << "Polygon";
|
|
|
+std::string Polygon<T>::name() const {
|
|
|
+ return "Polygon";
|
|
|
}
|