I know there are plenty of questions like these, but I couldn't find a solution that worked for me.
I am trying to make simple fraction calculator than can add or subtract any number of functions and write the answer as a reduced fraction.
Example: input= 3/2 + 4/ 8 , output = 2
I am trying overload operators in order to accomplish this.
So in the program I am trying to develop, the input consists of an expression made of fractions separated by the operators +
or -
.
The number of fractions in the expression is arbitrary.
Each of the following 6 lines is an example of a valid input expression:
1/2 + 3/4 1/2 -5/7+3/5 355/113 3 /9-21/ -7 4/7-5/-8 -2/-3+7/5
***The problem that I am having is that in when I run my program it has an overload operating error: *error: overloaded 'operator<<' must be a binary operator (has 3 parameters)****
/Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:61:22: error: overloaded 'operator<<' must be a binary operator (has 3 parameters) ostream& Fraction::operator<<(ostream &os, Fraction& n) ^ /Users/Spicycurryman/Desktop/ECS40/hw1/fraction.cpp:80:22: error: overloaded 'operator>>' must be a binary operator (has 3 parameters) istream& Fraction::operator>>(istream &os, Fraction& n)
I don't understand why that is an error.
My following code is below:
CPP FILE
#include "Fraction.h" Fraction::Fraction(int a, int b) { } int Fraction::find_gcd (int n1, int n2) { int gcd, remainder; remainder = n1 % n2; while ( remainder != 0 ) { n1 = n2; n2 = remainder; remainder = n1 % n2; } gcd = n2; return (gcd); } void Fraction::reduce_fraction(int nump, int denomp) { this->nump = nump; this->denomp = denomp; int gcd; gcd = find_gcd(nump, denomp); nump = nump / gcd; denomp = denomp / gcd; if ((denomp<0 && nump < 0 )) { denomp*=-1; nump*=-1; } else if (denomp < 0 && nump >0){ denomp*=-1; } if ( denomp ==0) { throw invalid_argument( "Error: zero denominator" ); } } Fraction& Fraction::operator+(const Fraction& n) { denom = denomp * n.denom; numera = (nump * n.numera) + (n.denom * n.nump); return (*this); } Fraction& Fraction::operator-(const Fraction& n) { denom = denomp * n.denom; numera = (nump * n.numera) - (n.denom* n.nump); return (*this); } ostream& Fraction::operator<<(ostream &os, Fraction& n) { if (n.numera == 0) { cout << 0 << endl; return os; } else if (n.numera == n.denom) { cout << 1 << endl; return os; } else { cout << n.numera << '/' << n.denom << endl; return os; } } istream& Fraction::operator>>(istream &os, Fraction& n) { char slash = 0; return os >> n.numera >> slash >> n.denom; }
Header File
#ifndef FRACTION_H #define FRACTION_H #include <iostream> #include <stdexcept> using namespace std; class Fraction{ public: Fraction(int a, int b); int fraction(int a,int b); int find_gcd(int n1, int n2); void reduce_fraction(int nump, int denomp); Fraction& operator+(const Fraction& n); Fraction& operator-(const Fraction& n); friend ostream& operator<<(ostream &os, const Fraction& n); friend istream& operator>>(istream &is, const Fraction& n); private: int denom; int numera; int denomp; int nump; }; #endif
MAIN CPP FILE
#include "Fraction.h" #include <iostream> using namespace std; int main() { Fraction x(2,3); Fraction y(6,-2); cout << x << endl; cout << y << endl; cin >> y; cout << y << endl; Fraction z = x + y; cout << x << " + " << y << " = " << z << endl; }
I know that the operators are member functions and a member function takes an implicit first parameter, meaning my operators now takes three parameters it may be fixed being a non-member function; however, that would not work in this program. How exactly in my case would I fix it so the program would work?
Thank you very much!
The problem is that you declared operator>>
and operator<<
as non-member functions, but defined as a member function.
This should fix that problem (but open another set of problems). So instead of
ostream& Fraction::operator<<(ostream &os, Fraction& n) { ... istream& Fraction::operator>>(istream &os, Fraction& n) { ...
implement as :
ostream& operator<<(ostream &os, Fraction& n) { ... istream& operator>>(istream &os, Fraction& n) { ...
Also, take a note that you declared functions as :
friend ostream& operator<<(ostream &os, const Fraction& n); friend istream& operator>>(istream &is, const Fraction& n);
but defined as (therefore you changed the signature) :
ostream& Fraction::operator<<(ostream &os, Fraction& n) istream& Fraction::operator>>(istream &os, Fraction& n)
Proper way is to declare and define as :
ostream& Fraction::operator<<(ostream &os, const Fraction& n) istream& Fraction::operator>>(istream &os, Fraction& n)
I am adding just changes. The rest is the same as in the question:
class Fraction{ friend ostream& operator<<(ostream &os, const Fraction& n); friend istream& operator>>(istream &is, Fraction& n); // the rest is the same }; ostream& operator<<(ostream &os, const Fraction& n) { if (n.numera == 0) { cout << 0 << endl; return os; } else if (n.numera == n.denom) { cout << 1 << endl; return os; } else { cout << n.numera << '/' << n.denom << endl; return os; } } istream& operator>>(istream &os, Fraction& n) { char slash = 0; return os >> n.numera >> slash >> n.denom; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With