A ésto me lo pidio un amigo, solo le puse sobrecarga al "+", con los demás operadores binarios es practicamente lo mismo.
#include <string>
#include <iostream>
using namespace std;
class TFraccion
{
private:
int num, den;
int gcd(int a, int b);
public:
TFraccion();
TFraccion(int num, int den);
TFraccion operator + (TFraccion f);
TFraccion & operator = (TFraccion f);
int getNum(){return num;};
int getDen(){return den;};
void getFormat(){
if(den == 1)
cout << num;
else
cout << num << "/" << den;
};
};
int TFraccion::gcd(int a, int b){
while(true){
if((a = a % b) == 0) return b;
if((b = b % a) == 0) return a;
}
}
TFraccion::TFraccion(){
TFraccion(0, 1);
}
TFraccion::TFraccion(int num, int den){
int m = gcd(num, den);
this->num = num/m;
this->den = den/m;
}
TFraccion TFraccion::operator + (TFraccion f){
int m;
TFraccion r;
r.num = this->num * f.den + this->den * f.num;
r.den = this->den * f.den;
m = gcd(r.num, r.den);
r.num = r.num/m;
r.den = r.den/m;
return r;
}
TFraccion & TFraccion::operator = (TFraccion f){
int m = gcd(f.num, f.den);
num = f.num/m;
den = f.den/m;
return *this;
}
// Testeo
int main()
{
TFraccion r, a(3,2), *b = new TFraccion(1,2), c(1,4);
cout << "r = "; a.getFormat(); cout << " + "; b->getFormat(); cout << " = ";
r = a + *b;
cout << r.getNum() << "/" << r.getDen() << " = "; r.getFormat(); cout << endl;
cout << "r = "; a.getFormat(); cout << " + "; b->getFormat(); cout << " + "; c.getFormat(); cout << " = ";
r = a + *b + c;
cout << r.getNum() << "/" << r.getDen() << " = "; r.getFormat(); cout << endl;
delete b;
return 0;
}
La salida es la siguiente:
r = 3/2 + 1/2 = 2/1 = 2
r = 3/2 + 1/2 + 1/4 = 9/4 = 9/4Saludos.