1  #ifndef TRIANGLE_H
  2  #define TRIANGLE_H
  3  #include "AbstractGeometricObject.h" // Defined in Listing 15.13
  4  #include "TriangleException.h"
  5  #include <cmath>
  6  
  7  class Triangle: public GeometricObject
  8  {
  9  public:
 10    Triangle()
 11    {
 12      side1 = side2 = side3 = 1;
 13    }
 14  
 15    Triangle(double side1, double side2, double side3)
 16    {
 17      if (!isValid(side1, side2, side3))
 18        throw TriangleException(side1, side2, side3);
 19  
 20      this->side1 = side1;
 21      this->side2 = side2;
 22      this->side3 = side3;
 23    }
 24  
 25    double getSide1() const
 26    {
 27      return side1;
 28    }
 29  
 30    double getSide2() const
 31    {
 32      return side2;
 33    }
 34  
 35    double getSide3() const
 36    {
 37      return side3;
 38    }
 39  
 40    void setSide1(double side1)
 41    {
 42      if (!isValid(side1, side2, side3))
 43        throw TriangleException(side1, side2, side3);
 44  
 45      this->side1 = side1;
 46    }
 47  
 48    void setSide2(double side2)
 49    {
 50      if (!isValid(side1, side2, side3))
 51        throw TriangleException(side1, side2, side3);
 52  
 53      this->side2 = side2;
 54    }
 55  
 56    void setSide3(double side3)
 57    {
 58      if (!isValid(side1, side2, side3))
 59        throw TriangleException(side1, side2, side3);
 60  
 61      this->side3 = side3;
 62    }
 63  
 64    double getPerimeter() const
 65    {
 66      return side1 + side2 + side3;
 67    }
 68  
 69    double getArea() const
 70    {
 71      double s = getPerimeter() / 2;
 72      return sqrt(s * (s - side1) * (s - side2) * (s - side3));
 73    }
 74  
 75  private:
 76    double side1, side2, side3;
 77  
 78    bool isValid(double side1, double side2, double side3) const
 79    {
 80      return (side1 < side2 + side3) && (side2 < side1 + side3) &&
 81        (side3 < side1 + side2);
 82    }
 83  };
 84  
 85  #endif