Re: Errors with my program
You haven't provided the implementation code for Fraction so I can't try to compile the code. Also the implementation code for
Code:
std::istream &operator>>(std:: istream &, Point &);
std:: ostream &operator<<(std:: ostream &, Point);
If you would provide fraction .cpp and Point.cpp so that there's all the parts required to compile, then we can try to compile and advise on the errors etc.
Re: Errors with my program
I only made the files shown above. Each code area is its own file.
Re: Errors with my program
In that case that is part of the problem. You have member function declarations but no member functions definitions. eg the Fraction constructor should set the member variables num and den. In Fraction.cpp you'd have something like:
Code:
#include "Fraction.h"
Fraction::Fraction(int32_t n, int32_t d) : num(n), den(d) {}
and similar for the other Fraction member functions.
You also need to define the class Point << and >> functions. Eg in point.cpp for <<
Code:
#include <iostream>
#include "Point.h"
std::ostream& Point::operator<<(std::ostream& os, const Point& p) {
return os << '(' << p.getX() << ',' << p.getY() << ')';
}
You also need a Point constructor and a Point default constructor.
In the .h files where you have a function declaration that ends with a ; you also need to provide a function definition that contains the implementation code for that function.
Re: Errors with my program
As a starter for the class Fraction, consider this:
Code:
#include <iostream>
#include <numeric>
#include <exception>
class fraction {
public:
fraction(int n, int d) : num(n), den(d) {
reduce();
}
explicit fraction(int i = 0) : num(i), den(1) {}
fraction(const fraction& fr) = default;
fraction(fraction&& fr) = default;
fraction& operator=(const fraction& fr) = default;
fraction& operator=(fraction&& fr) = default;
fraction& operator=(int i) {
num = i;
den = 1;
return *this;
}
fraction& reduce() {
if (den == 0) {
num = 0;
den = 1;
throw std::overflow_error("Denominator zero exception");
}
if (den < 0) {
num *= -1;
den *= -1;
}
if (den > 1)
if (const int g = std::gcd(num, den); g != 1) {
num /= g;
den /= g;
}
return *this;
}
fraction& invert() {
std::swap(num, den);
return *this;
}
fraction& neg() {
num *= -1;
return *this;
}
fraction operator-() {
fraction f(*this);
return f.neg();
}
fraction& operator+=(const fraction& fr) {
const int l = std::lcm(fr.den, den);
num = l / den * num + l / fr.den * fr.num;
den = l;
return reduce();
}
fraction& operator+=(int i) {
return *this += fraction(i);
}
fraction operator+(const fraction& fr) const {
fraction f(*this);
return f += fr;
}
fraction operator+(int i) const {
fraction f(*this);
return f += i;
}
fraction& operator*=(const fraction& fr) {
num *= fr.num;
den *= fr.den;
return reduce();
}
fraction& operator*=(int i) {
return *this *= fraction(i);
}
fraction operator*(const fraction& fr) const {
fraction f(*this);
return f *= fr;
}
fraction operator*(int i) const {
fraction f(*this);
return f *= i;
}
fraction& operator/=(const fraction& fr) {
fraction f(fr);
return *this *= f.invert();
}
fraction& operator/=(int i) {
fraction f(i);
return *this *= f.invert();
}
fraction operator/(const fraction& fr) const {
fraction f(fr);
return f.invert() *= *this;
}
fraction operator/(int i) const {
fraction f(i);
return f.invert() *= *this;
}
fraction& operator-=(const fraction& fr) {
fraction f(fr);
return *this += f.neg();
}
fraction& operator-=(int i) {
fraction f(i);
return *this += f.neg();
}
fraction operator-(const fraction& fr) const {
fraction f(fr);
return f.neg() += *this;
}
fraction operator-(int i) const {
fraction f(i);
return f.neg() += *this;
}
fraction& operator++() { //Prefix
return *this += 1;
}
fraction operator++(int) { // Postfix
fraction f(*this);
++(*this);
return f;
}
fraction& operator--() { //Prefix
return *this -= 1;
}
fraction operator--(int) { // Postfix
fraction f(*this);
--(*this);
return f;
}
bool operator==(const fraction& fr) const {
return (fr.num == num) && (fr.den == den);
}
bool operator!=(const fraction& fr) const {
return !(*this == fr);
}
bool operator>(const fraction& fr) const {
const int l = std::lcm(fr.den, den);
return ((l / den * num) > (l / fr.den * fr.num));
}
bool operator <=(const fraction& fr) const {
return !(*this <= fr);
}
bool operator>=(const fraction& fr) const {
return (*this == fr) || (*this > fr);
}
bool operator<(const fraction& fr) const {
return !(*this >= fr);
}
bool operator==(int i) const {
return *this == fraction(i);
}
bool operator!=(int i) const {
return !(*this == i);
}
bool operator>(int i) const {
return *this > fraction(i);
}
bool operator<=(int i) const {
return !(*this > i);
}
bool operator>=(int i) const {
return *this >= fraction(i);
}
bool operator<(int i) const {
return !(*this >= i);
}
friend std::ostream& operator<<(std::ostream& os, const fraction& fr);
friend std::istream& operator>>(std::istream& is, fraction& fr);
private:
int num = 0;
int den = 1;
};
inline bool operator==(int i, const fraction& fr) {
return fr == i;
}
inline bool operator!=(int i, const fraction& fr) {
return fr != i;
}
inline bool operator>(int i, const fraction& fr) {
return fr < i;
}
inline bool operator>=(int i, const fraction& fr) {
return fr <= i;
}
inline bool operator<(int i, const fraction& fr) {
return fr > i;
}
inline bool operator<=(int i, const fraction& fr) {
return fr >= i;
}
inline fraction operator+(int i, const fraction& fr) {
return fr + i;
}
inline fraction operator*(int i, const fraction& fr) {
return fr * i;
}
inline fraction operator/(int i, const fraction& fr) {
fraction f(fr);
return f.invert() * i;
}
inline fraction operator-(int i, const fraction& fr) {
fraction f(fr);
return f.neg() + i;
}
std::ostream& operator<<(std::ostream& os, const fraction& fr) {
if ((abs(fr.num) > fr.den) && (fr.den > 1))
os << fr.num / fr.den << "+" << fraction(abs(fr.num) % fr.den, fr.den);
else {
os << fr.num;
if (fr.den != 1)
os << "/" << fr.den;
}
return os;
}
std::istream& operator>>(std::istream& is, fraction& fr) {
auto getden = [&]() {
is >> fr.den;
if (fr.den == 0) {
is.setstate(std::ios::failbit);
fr = 0;
}
};
int n = 0;
fr = 0;
is >> n;
if (auto ch = is.peek(); (ch == '+') || (ch == '/')) {
is.get();
if (ch == '+') {
is >> fr.num;
if (is.peek() == '/') {
is.get();
getden();
if (is.good())
fr = (n < 0) ? n - fr : n + fr;
}
} else {
fr.num = n;
getden();
}
} else
fr = n;
fr.reduce();
return is;
}