Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

[C++] Перегрузка операторов

6.7K
19 марта 2007 года
Ginza9
96 / / 30.06.2006
Пишу класс для работы с дробями. В процессе написания возникают непонятные ошибки.


Класс:

Код:
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);
};


Перегрузка оператор + и оператора выводв:


Код:
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; 
}


Функция main


 
Код:
void main() {
    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...
320
19 марта 2007 года
m_Valery
1.0K / / 08.01.2007
Таких примеров полно,поиск попробуй поможет:)
Вот тут смотри
361
19 марта 2007 года
Odissey_
661 / / 19.09.2006
попробуй добавить const Decimal& в все операторы
320
19 марта 2007 года
m_Valery
1.0K / / 08.01.2007
friend istream &operator>>(istream &stream,Decimal &obj);
тут нужна неконстантная ссылка,потому что обьект должен быть модифицирован для сохранения вводимой дроби.
1.8K
19 марта 2007 года
k3Eahn
365 / / 19.12.2005
В студии(2003) подобного рода ошибок не возникает.
ЗЫ Судя по ошибке, автор пользуется борландовским компилятором.
361
19 марта 2007 года
Odissey_
661 / / 19.09.2006
Просмотрел. Ага. Просто со своей траблой перекликалось вот и ляпнул. Присмотрелся -
у тебя типы разные, здесь - friend istream &operator>>(istream &stream,Decimal &obj) у тебя Decimal &obj.
А здесь - Decimal operator+(Decimal &obj) просто Decimal возращаемый;
Сделай Decimal & operator+(Decimal &obj).
1.8K
19 марта 2007 года
k3Eahn
365 / / 19.12.2005
Odissey_
Нельзя возвращать ссылку на локальный объект.
Ginza9
Если уж припёрло изменять объект в операторе вывода (при этом имея возможность передавать в качестве параметра временный объект (не lvalue)), то можно переменные класса объекта сопроводить ключевым словом mutable, а принимать объект в операторе по константной ссылке.
ЗЫ Или же меняй компилятор.
6.7K
19 марта 2007 года
Ginza9
96 / / 30.06.2006
Так как преодолеть эту ошибку? Даже не знаю, где собака порылась...
6.7K
19 марта 2007 года
Ginza9
96 / / 30.06.2006
Проблемку решил! Всем спасибо.

Цитата: k3Eahn
Odissey_
Нельзя возвращать ссылку на локальный объект.
Ginza9
Если уж припёрло изменять объект в операторе вывода (при этом имея возможность передавать в качестве параметра временный объект (не lvalue)), то можно переменные класса объекта сопроводить ключевым словом mutable, а принимать объект в операторе по константной ссылке.
ЗЫ Или же меняй компилятор.



Сделал именно, как Вы и сказали. Убрал в тех функциях амперсанды(т.е. теперь создаются в самих функциях копии объектов передаваемых). И проблема отпала. Все заработало. Но для меня по-прежнему загадка, почему Borland BCC 5.1 себя так повел...

1.8K
19 марта 2007 года
k3Eahn
365 / / 19.12.2005
Вообще я предлагал привести код к такому виду:
Код:
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);
             
};
Код:
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;    
}
 
Код:
int main()
{
   
    Decimal A(0,3,2), B(0,2,3);
       
    cout << A + B;
   
    return 0;
}
361
20 марта 2007 года
Odissey_
661 / / 19.09.2006
+1.
Хорошее знание материала.
А вообще могу посоветовать посмотреть Страуструпа "Язык программироваия С++", там как раз перегрузка операторов рассмотрена на классе Complex.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог