#pragma once #include namespace FractionNS { struct divide_by_zero_error : public std::logic_error { divide_by_zero_error() : std::logic_error("tried to divide by zero") {}; }; struct not_real_error : public std::logic_error { not_real_error() : std::logic_error("value is not a real number") {}; }; struct not_defined_error : public std::logic_error { not_defined_error() : std::logic_error("operation result is not defined") {}; }; class Fraction { private: int m_numerator, m_denominator; void reduce(); public: Fraction(int, int); Fraction(int); Fraction(double); Fraction(float); Fraction(const Fraction&); int getNumerator() const; int getDenominator() const; void setNumerator(const int); void setDenominator(const int); QString display() const; Fraction& inv() const; float toFloat() const; double toDouble() const; // Binary comparison operators bool operator==(const int) const; bool operator==(const float) const; bool operator==(const double) const; bool operator==(const Fraction&) const; bool operator!=(const int) const; bool operator!=(const float) const; bool operator!=(const double) const; bool operator!=(const Fraction&) const; bool operator<(const int) const; bool operator<(const float) const; bool operator<(const double) const; bool operator<(const Fraction&) const; bool operator<=(const int) const; bool operator<=(const float) const; bool operator<=(const double) const; bool operator<=(const Fraction&) const; bool operator>(const int) const; bool operator>(const float) const; bool operator>(const double) const; bool operator>(const Fraction&) const; bool operator>=(const int) const; bool operator>=(const float) const; bool operator>=(const double) const; bool operator>=(const Fraction&) const; // Binary math operators Fraction& operator+(const int) const; Fraction& operator+(const Fraction&) const; Fraction& operator+=(const int); Fraction& operator+=(const Fraction&); Fraction& operator-(const int) const; Fraction& operator-(const Fraction&) const; Fraction& operator-=(const int); Fraction& operator-=(const Fraction&); Fraction& operator*(const int) const; Fraction& operator*(const Fraction&) const; Fraction& operator*=(const int); Fraction& operator*=(const Fraction&); Fraction& operator/(const int) const; Fraction& operator/(const Fraction&) const; Fraction& operator/=(const int); Fraction& operator/=(const Fraction&); // Unary operators Fraction& operator-() const; Fraction& operator+() const; // Should return a copy of the Fraction. }; }