class Decimal {
private:
int int_part,num,denom,nod;
public:
Decimal() { int_part=0;num=0;denom=0;nod=0; }
Decimal(int a,int b,int c) { int_part=a;num=b;denom=c; }
friend istream &operator>>(istream &stream,Decimal &obj);
friend ostream &operator<<(ostream &stream,Decimal &obj);
Decimal operator+(Decimal &obj);
Decimal &operator=(Decimal &obj);
Decimal operator-(Decimal &obj);
Decimal operator*(Decimal &obj);
Decimal operator/(Decimal &obj);
void Set_nod();
int NOD(int a,int b);
};
[C++] Перегрузка операторов
Класс:
Код:
Перегрузка оператор + и оператора выводв:
Код:
Decimal Decimal::operator+(Decimal &obj) {
Decimal tmp;
tmp.int_part=0; // на это внимания не обращайте
tmp.num=num*obj.denom+obj.num*denom;
tmp.denom=denom*obj.denom;
tmp.nod=NOD(tmp.num,tmp.denom);
return tmp;
}
ostream &operator<<(ostream &stream,Decimal &obj) {
if(obj.nod>0) {
obj.num/=obj.nod;
obj.denom/=obj.nod;
}
if(flag=='Y') {
if(obj.denom==1) stream << obj.int_part + obj.num;
else stream << obj.int_part << " " << obj.num << "/" << obj.denom;
}
else {
if(obj.denom==1) stream << obj.num;
else stream << obj.num << "/" << obj.denom;
}
return stream;
}
Decimal tmp;
tmp.int_part=0; // на это внимания не обращайте
tmp.num=num*obj.denom+obj.num*denom;
tmp.denom=denom*obj.denom;
tmp.nod=NOD(tmp.num,tmp.denom);
return tmp;
}
ostream &operator<<(ostream &stream,Decimal &obj) {
if(obj.nod>0) {
obj.num/=obj.nod;
obj.denom/=obj.nod;
}
if(flag=='Y') {
if(obj.denom==1) stream << obj.int_part + obj.num;
else stream << obj.int_part << " " << obj.num << "/" << obj.denom;
}
else {
if(obj.denom==1) stream << obj.num;
else stream << obj.num << "/" << obj.denom;
}
return stream;
}
Функция main
Код:
void main() {
Decimal A(0,3,2),B(0,2,3);
cout << A+B; // ошибка возникает здесь
}
Decimal A(0,3,2),B(0,2,3);
cout << A+B; // ошибка возникает здесь
}
Переменная flag отвечает за то, вводилась ли целая часть или нет.
Ошибка:
Error E2094 decimal.cpp 104: 'operator<<' not implemented in type 'ostream' for arguments of type 'Decimal' in function main()
__________________
We're brothers of metal...
Вот тут смотри
попробуй добавить const Decimal& в все операторы
тут нужна неконстантная ссылка,потому что обьект должен быть модифицирован для сохранения вводимой дроби.
ЗЫ Судя по ошибке, автор пользуется борландовским компилятором.
у тебя типы разные, здесь - friend istream &operator>>(istream &stream,Decimal &obj) у тебя Decimal &obj.
А здесь - Decimal operator+(Decimal &obj) просто Decimal возращаемый;
Сделай Decimal & operator+(Decimal &obj).
Нельзя возвращать ссылку на локальный объект.
Ginza9
Если уж припёрло изменять объект в операторе вывода (при этом имея возможность передавать в качестве параметра временный объект (не lvalue)), то можно переменные класса объекта сопроводить ключевым словом mutable, а принимать объект в операторе по константной ссылке.
ЗЫ Или же меняй компилятор.
Так как преодолеть эту ошибку? Даже не знаю, где собака порылась...
Цитата: k3Eahn
Odissey_
Нельзя возвращать ссылку на локальный объект.
Ginza9
Если уж припёрло изменять объект в операторе вывода (при этом имея возможность передавать в качестве параметра временный объект (не lvalue)), то можно переменные класса объекта сопроводить ключевым словом mutable, а принимать объект в операторе по константной ссылке.
ЗЫ Или же меняй компилятор.
Нельзя возвращать ссылку на локальный объект.
Ginza9
Если уж припёрло изменять объект в операторе вывода (при этом имея возможность передавать в качестве параметра временный объект (не lvalue)), то можно переменные класса объекта сопроводить ключевым словом mutable, а принимать объект в операторе по константной ссылке.
ЗЫ Или же меняй компилятор.
Сделал именно, как Вы и сказали. Убрал в тех функциях амперсанды(т.е. теперь создаются в самих функциях копии объектов передаваемых). И проблема отпала. Все заработало. Но для меня по-прежнему загадка, почему Borland BCC 5.1 себя так повел...
Код:
class Decimal {
private:
[COLOR=Red]mutable[/COLOR] int num,denom;
int int_part, nod;
public:
Decimal() { int_part=0;num=0;denom=0;nod=0; }
Decimal(int a,int b,int c) { int_part=a;num=b;denom=c; }
friend istream &operator>>(istream &stream,Decimal &obj);
friend ostream &operator<<(ostream &stream,[COLOR=Red] const Decimal &obj[/COLOR]);
Decimal operator+(Decimal &obj);
Decimal &operator=(Decimal &obj);
Decimal operator-(Decimal &obj);
Decimal operator*(Decimal &obj);
Decimal operator/(Decimal &obj);
void Set_nod();
int NOD(int a,int b);
};
private:
[COLOR=Red]mutable[/COLOR] int num,denom;
int int_part, nod;
public:
Decimal() { int_part=0;num=0;denom=0;nod=0; }
Decimal(int a,int b,int c) { int_part=a;num=b;denom=c; }
friend istream &operator>>(istream &stream,Decimal &obj);
friend ostream &operator<<(ostream &stream,[COLOR=Red] const Decimal &obj[/COLOR]);
Decimal operator+(Decimal &obj);
Decimal &operator=(Decimal &obj);
Decimal operator-(Decimal &obj);
Decimal operator*(Decimal &obj);
Decimal operator/(Decimal &obj);
void Set_nod();
int NOD(int a,int b);
};
Код:
Decimal Decimal::operator+(Decimal &obj) {
Decimal tmp;
tmp.int_part=0;
tmp.num=num*obj.denom+obj.num*denom;
tmp.denom=denom*obj.denom;
tmp.nod=NOD(tmp.num,tmp.denom);
return tmp;
}
ostream &operator<<(ostream &stream, [COLOR=Red]const Decimal &obj[/COLOR]) {
if(obj.nod>0) {
obj.num/=obj.nod;
obj.denom/=obj.nod;
}
if(flag=='Y') {
if(obj.denom==1) stream << obj.int_part + obj.num;
else stream << obj.int_part << " " << obj.num << "/" << obj.denom;
}
else {
if(obj.denom==1) stream << obj.num;
else stream << obj.num << "/" << obj.denom;
}
return stream;
}
Decimal tmp;
tmp.int_part=0;
tmp.num=num*obj.denom+obj.num*denom;
tmp.denom=denom*obj.denom;
tmp.nod=NOD(tmp.num,tmp.denom);
return tmp;
}
ostream &operator<<(ostream &stream, [COLOR=Red]const Decimal &obj[/COLOR]) {
if(obj.nod>0) {
obj.num/=obj.nod;
obj.denom/=obj.nod;
}
if(flag=='Y') {
if(obj.denom==1) stream << obj.int_part + obj.num;
else stream << obj.int_part << " " << obj.num << "/" << obj.denom;
}
else {
if(obj.denom==1) stream << obj.num;
else stream << obj.num << "/" << obj.denom;
}
return stream;
}
Код:
int main()
{
Decimal A(0,3,2), B(0,2,3);
cout << A + B;
return 0;
}
{
Decimal A(0,3,2), B(0,2,3);
cout << A + B;
return 0;
}
Хорошее знание материала.
А вообще могу посоветовать посмотреть Страуструпа "Язык программироваия С++", там как раз перегрузка операторов рассмотрена на классе Complex.