#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; // <=> would go here // Method versions of operators Fraction& add(const Fraction&) const; Fraction& add(const int) const; Fraction& sub(const Fraction&) const; Fraction& sub(const int) const; Fraction& mul(const Fraction&) const; Fraction& mul(const int) const; Fraction& div(const Fraction&) const; Fraction& div(const int) const; Fraction& inc(); Fraction& dec(); // 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&); // Maybe replace with ^ operator, as it's unused for this class. // Might be syntactically not-so-nice though? // Python uses / for combining paths, does cpp do something similar anywhere? // How does one raise a Fraction to a power while keeping it a Fraction (avoid double return type) double pow(const int) const; double pow(const Fraction&) const; // Unary operators Fraction& operator-() const; Fraction& operator+() const; // Should return a copy of the Fraction. Fraction& operator++(); // ++x Fraction& operator++(const int); // x++ Fraction& operator--(); // --x Fraction& operator--(const int); // x-- }; }