Explorar o código

Updated Figures

Vsevolod Levitan hai 11 meses
pai
achega
5840b2fc72
Modificáronse 2 ficheiros con 33 adicións e 27 borrados
  1. 6 4
      Figures/Figures/Figures.cpp
  2. 27 23
      Figures/Figures/Figures.h

+ 6 - 4
Figures/Figures/Figures.cpp

@@ -1,15 +1,19 @@
 #include <iostream>
 #include "Figures.h"
 
+using namespace std;
+
+
 int main()
 {
-    std::vector <GeometricFigure<double>*> figures;
+    vector <GeometricFigure<double>*> figures;
 
     Circle<double> circle(Point<double>(0, 0), 5.0);
     Ellipse<double> ellipse(Point<double>(0, 0), 3.0, 2.0);
     Triangle<double> triangle(Point<double>(0, 0), Point<double>(3, 0), Point<double>(0, 4));
     Rectangle<double> rectangle(Point<double>(0, 0), Point<double>(3, 0), Point<double>(3, 4), Point<double>(0, 4));
     Polygon<double> polygon("bounds.txt");
+
     figures.push_back(&circle);
     figures.push_back(&ellipse);
     figures.push_back(&triangle);
@@ -17,8 +21,6 @@ int main()
     figures.push_back(&polygon);
 
     for (const auto& figure : figures) {
-        figure->name();
-        std::cout << "Area: " << figure->calc_area() << std::endl;
-        std::cout << "Perimeter: " << figure->calc_perimeter() << std::endl << "\n";
+        cout << *figure << endl;
     }
 }

+ 27 - 23
Figures/Figures/Figures.h

@@ -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";
 }