Перегрузка операторов += -=
Это класс дробей. Мне нужно сделать перегрузку операторов += и -=. + и - я сделал. На остальное голова не варит. Помогите. main.cpp
#include <iostream>
#include "module.h"
using namespace std;
int main(int argc, char** argv) {
Decimal d(1,2);
Decimal b;
b=d+1;
cout << b << " ";
b=1+d;
cout << b << " ";
Decimal dc1(2, 5);
Decimal dc2(3, 9);
dc1 +=dc2;
cout << dc1 << " ";
Decimal f(6,24);
f.simplify();
cout<<f<<" ";
cout<<"-f= "<<-f;
return 0;
}
module.cpp
#include "module.h"
Decimal::Decimal(){
this->numeration=0;
this->denomination=1;
}
Decimal::Decimal(int a){
this->numeration=a;
this->denomination=1;
}
Decimal::Decimal(int a,int b){
this->numeration=a;
if(b!=0)
this->denomination=b;
else
this->denomination=1;
}
Decimal::Decimal(const Decimal &d){
this->numeration=d.numeration;
this->denomination=d.denomination;
}
void Decimal::set_numerator(int a){
this->numeration=a;
}
void Decimal::set_denominator(int a){
if(a!=0)
this->denomination=a;
else
this->denomination=1;
}
int Decimal::get_numerator(){
return this->numeration;
}
int Decimal::get_denominator(){
return this->denomination;
}
void Decimal::simplify(){
int c=1;
if(this->numeration<0)
c=-1;
for(int i=this->numeration;i>1;i--){
if((this->numeration%i==0)&&(this->denomination%i==0)){
this->numeration/=i;
this->denomination/=i;
}
}
}
Decimal Decimal::operator+(const Decimal &d){
Decimal rez;
int a,b,c,i=2;
if (this->denomination>d.denomination){
c=a=d.denomination;
b=this->denomination;
}else{
c=a=this->denomination;
b=d.denomination;
}
while(c%b!=0){
c=a;
c*=i;
i++;
}
rez.denomination=c;
rez.numeration=this->numeration*(c/this->denomination)+d.numeration*(c/d.denomination);
return rez;
}
Decimal Decimal::operator+(int a){
Decimal rez;
rez.denomination=this->denomination;
rez.numeration=this->numeration+a*this->denomination;
return rez;
}
Decimal operator +(int a,const Decimal &d){
Decimal rez;
rez.denomination=d.denomination;
rez.numeration=d.numeration+a*d.denomination;
return rez;
}
Decimal Decimal::operator+=(const Decimal &d){
this->numeration *= d.denomination; // 3/4 += 1/5 => 3/4 + 1/5 = (3*5 + 1*4)/(4*5)
this->numeration += this->denomination * d.numeration;
this->denomination *= d.denomination;
return *this;
}
Decimal Decimal::operator-(const Decimal &d){
Decimal rez;
int a,b,c,i=2;
if (this->denomination>d.denomination){
c=a=d.denomination;
b=this->denomination;
}else{
c=a=this->denomination;
b=d.denomination;
}
while(c%b!=0){
c=a;
c*=i;
i++;
}
rez.denomination=c;
rez.numeration=this->numeration*(c/this->denomination)-d.numeration*(c/d.denomination);
return rez;
}
Decimal Decimal::operator-(int a){
Decimal rez;
rez.denomination=this->denomination;
rez.numeration=this->numeration-a*this->denomination;
return rez;
}
Decimal operator -(int a,const Decimal &d){
Decimal rez;
rez.denomination=d.denomination;
rez.numeration=d.numeration-a*d.denomination;
return rez;
}
Decimal Decimal::operator-(){
Decimal rez;
rez.numeration=this->numeration*-1;
rez.denomination=this->denomination;
return rez;
}
Decimal Decimal::operator-=(const Decimal &d){
this->numeration *= d.denomination; //(3*5 - 1*4)/(4*5)
this->numeration -= this->denomination * d.numeration;
this->denomination *= d.denomination;
return *this;
}
Decimal Decimal::operator *(const Decimal &d){
Decimal rez;
rez.numeration=this->numeration*d.numeration;
rez.denomination=this->denomination*d.denomination;
return rez;
}
Decimal Decimal::operator*(int a){
Decimal rez;
rez.denomination=this->denomination;
rez.numeration=this->numeration*a;
return rez;
}
Decimal operator *(int a,const Decimal &d){
Decimal rez;
rez.denomination=d.denomination;
rez.numeration=d.numeration*a;
return rez;
}
Decimal Decimal::operator /(const Decimal &d){
Decimal rez;
rez.numeration=this->numeration*d.denomination;
rez.denomination=this->denomination*d.numeration;
return rez;
}
Decimal Decimal::operator/(int a){
Decimal rez;
rez.denomination=this->denomination*a;
rez.numeration=this->numeration;
return rez;
}
Decimal operator/(int a,const Decimal &d){
Decimal rez;
rez.denomination=d.denomination*a;
rez.numeration=d.numeration;
return rez;
}
bool Decimal::operator ==(const Decimal &d){
if((this->numeration==d.numeration)&&(this->denomination==d.denomination))
return true;
else
return false;
}
bool Decimal::operator >(const Decimal &d){
if(double(this->numeration)/double(this->denomination)>double(d.numeration)/double(d.denomination))
return true;
else
return false;
}
bool Decimal::operator <(const Decimal &d){
if(double(this->numeration)/double(this->denomination)<double(d.numeration)/double(d.denomination))
return true;
else
return false;
}
bool Decimal::operator >=(const Decimal &d){
if(double(this->numeration)/double(this->denomination)>=double(d.numeration)/double(d.denomination))
return true;
else
return false;
}
bool Decimal::operator <=(const Decimal &d){
if(double(this->numeration)/double(this->denomination)<=double(d.numeration)/double(d.denomination))
return true;
else
return false;
}
bool Decimal::operator !=(const Decimal &d){
if((this->numeration!=d.numeration)||(this->denomination!=d.denomination))
return true;
else
return false;
}
Decimal Decimal::operator =(const Decimal &d){
this->numeration=d.numeration;
this->denomination=d.denomination;
return *this;
}
Decimal::operator float(){
float rez;
rez=float(this->numeration)/float(this->denomination);
return rez;
}
Decimal::operator double(){
double rez;
rez=double(this->numeration)/double(this->denomination);
return rez;
}
ostream& operator<< (ostream &out, const Decimal &d){
out << d.numeration << "/" << d.denomination;
return out;
}
istream& operator>> (istream &in, Decimal &d){
in >> d.numeration;
in >> d.denomination;
return in;
}
module.h
#ifndef CLASS_DATETIME_H
#define CLASS_DATETIME_H
#include <iostream>
using namespace std;
class Decimal{
private:
int numeration, denomination;
public:
Decimal();
Decimal(int a);
Decimal(int a,int b);
Decimal(const Decimal &d);
void set_numerator(int a);
void set_denominator(int a);
inline int get_numerator();
inline int get_denominator();
void simplify();
Decimal operator+(const Decimal &d);
Decimal operator+(int a);
Decimal operator+=(const Decimal &d);
Decimal operator+=(int a);
Decimal operator-(const Decimal &d);
Decimal operator-(int a);
Decimal operator-=(const Decimal &d);
Decimal operator-=(int a);
Decimal operator-();
Decimal operator*(const Decimal &d);
Decimal operator*(int a);
Decimal operator/(const Decimal &d);
Decimal operator/(int a);
bool operator ==(const Decimal &d);
bool operator >(const Decimal &d);
bool operator <(const Decimal &d);
bool operator >=(const Decimal &d);
bool operator <=(const Decimal &d);
bool operator !=(const Decimal &d);
bool operator =(const Decimal &d);
operator float();
operator double();
friend ostream& operator<< (ostream &out, const Decimal &d);
friend istream& operator>> (istream &in, Decimal &d);
friend Decimal operator +(int a,const Decimal &d);
friend Decimal operator +=(int a,const Decimal &d);
friend Decimal operator -(int a,const Decimal &d);
friend Decimal operator -=(int a,const Decimal &d);
friend Decimal operator *(int a,const Decimal &d);
friend Decimal operator /(int a,const Decimal &d);
};
#endif
Вывод компилятора:
[Error] no 'Decimal Decimal::operator-=(const Decimal&)' member function declared in class 'Decimal' [Error] no 'Decimal Decimal::operator+=(const Decimal&)' member function declared in class 'Decimal' recipe for target 'module.o' failed
Ответы (1 шт):
Автор решения: DSuhoi
→ Ссылка
Decimal Decimal::operator+=(const Decimal &d){
this->numeration *= d.denomination; // 3/4 += 1/5 => 3/4 + 1/5 = (3*5 + 1*4)/(4*5)
this->numeration += this->denomination * d.numeration;
this->denomination *= d.denomination;
return *this;
}
Decimal Decimal::operator-=(const Decimal &d){
this->numeration *= d.denomination; //(3*5 - 1*4)/(4*5)
this->numeration -= this->denomination * d.numeration;
this->denomination *= d.denomination;
return *this;
}