-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFractionClassOverload.cpp
60 lines (47 loc) · 1.69 KB
/
FractionClassOverload.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <numeric> // for std::gcd
class Fraction
{
private:
int m_numerator;
int m_denumerator;
public:
Fraction() = default;
Fraction(int numerator, int denumerator) : m_numerator { numerator }, m_denumerator {denumerator} { reduce(); }
void print() { std::cout << m_numerator << "/" << m_denumerator << std::endl; }
void reduce()
{
int gcd = std::gcd(m_numerator, m_denumerator);
if (gcd)
{
m_numerator /= gcd;
m_denumerator /= gcd;
}
}
friend Fraction operator*(const Fraction &fraction1, const Fraction &fraction2){ return Fraction(fraction1.m_numerator * fraction2.m_numerator, fraction1.m_denumerator * fraction2.m_denumerator); }
friend Fraction operator*(const Fraction &fraction, int x){ return Fraction(fraction.m_numerator * x, fraction.m_denumerator); }
friend Fraction operator*(int x, const Fraction &fraction){ return Fraction(fraction.m_numerator * x, fraction.m_denumerator); }
friend std::ostream& operator<<(std::ostream &output, const Fraction &fraction);
friend std::istream& operator>>(std::istream &input, Fraction &fraction);
};
std::ostream& operator<<(std::ostream &output, const Fraction &fraction)
{
output << fraction.m_numerator << "/" << fraction.m_denumerator;
return output;
}
std::istream& operator>>(std::istream &input, Fraction &fraction)
{
input >> fraction.m_numerator >> fraction.m_denumerator;
return input;
}
int main()
{
Fraction f1;
std::cout << "Enter fraction 1: ";
std::cin >> f1;
Fraction f2;
std::cout << "Enter fraction 2: ";
std::cin >> f2;
std::cout << f1 << " * " << f2 << " is " << f1 * f2 << '\n'; // note: The result of f1 * f2 is an r-value
return 0;
}