Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > перегрузка


Автор: observateur 18.11.2006, 17:44
Код

#include "stdafx.h"
#include <iostream>
using namespace std;
class money
{
private: int funt,silling,penny;

public: money():funt(0),silling(0),penny(0)
        {}    

        friend istream& operator>>(istream& s, money& m);
        friend ostream& operator<<(ostream& s, money& m);
};
///////////////////////////////////////
istream& operator>>(istream& s, money& m)
{
    cout<<"Enter funt: ";            s>>m.funt;    
    cout<<"Enters silling: ";        s>>m.silling;    
    cout<<"Enter penny: ";        s>>m.penny;

    return s;
}
ostream& operator<<(ostream& s, money& m)
{
    s<<m.funt<<": funt\n"<<m.silling<<": silling\n"<<m.penny<<": penny\n";

    return s;
}
int main(int argc, char* argv[])
{

    money mon1,mon2;
    cout<<"Enter first money:\n ";
    
    cin>>mon1;

    cout<<"\nEnter second money:\n ";
    
    cin>>mon2;

    cout<<endl<<mon1<<endl<<mon2;

    return 0;
}

вопрос у меня такой могу ли я перегрузит  операцию << и + что бы одним выражением у меня получилась такая функция
Код
cout<<mon1+mon2;
 

Автор: Kuvaldis 18.11.2006, 17:54
observateur, 
Цитата

вопрос у меня такой могу ли я перегрузит  операцию << и + что бы одним выражением у меня получилась такая функция

Можешь, но для этого придется прегружить операцию сложения для твоего класса money
Точное определение сложения напишешь сам, а я покажу схему:
функция friend
Код

money operator + (const money& m1, const money& m2)
{
       money temp = m1;
      temp.funt + =  m2.funt;  
      ....
      return temp;
}

Существенно то, что возвращается объект
Поэтому при вызове такой конструкции
Код

cout<< (mon1+mon2);

Вычислится сумма, вернется объект (один), а для него есть перегруженный оператор <<  smile 
P.S. скобки обязательны (как и для других типов, включая стандартные, например, int)

Автор: observateur 18.11.2006, 18:01
Цитата(Kuvaldis @  18.11.2006,  17:54 Найти цитируемый пост)
скобки обязательны (как и для других типов, включая стандартные, например, int)

Код

#include "stdafx.h"
#include <iostream>
using namespace std;


int main(int argc, char* argv[])
{
    int a=5;
    int b=15;

    cout<<a+b<<endl;



    return 0;
}


а вот ...без скобок можно же здесь обойтис....

Добавлено @ 18:02 
между прочим давно тебя не видно  ....как дела....

Автор: MAKCim 18.11.2006, 18:04
Цитата

Код

money money::operator + (const money& m1, const money& m2)
{
       money temp = m1;
      temp.funt + =  m2.funt;  
      ....
      return temp;
}


в этом случае operator+ должен быть friend-ом, а не member-ом
кроме того должно быть
Цитата

friend ostream& operator<<(ostream& s, const money& m);

потому как возможна лишь константная ссылка на временный объект, который из operator+ возвращается

Автор: Kuvaldis 18.11.2006, 18:05
observateur, 
Цитата

а вот ...без скобок можно же здесь обойтис....

Да.. Погарячился, но я всегда ставлю, для убийства неоднозначности...
Но не в этом дело... Я тебе про другое говорю... А это частности

MAKCim
согласен, "и на старуху бывает проруха" - на автомате писал smile 

Автор: observateur 18.11.2006, 20:15
спасибо товарищи у меня все OK.... благодарен....

Цитата(MAKCim @  18.11.2006,  18:04 Найти цитируемый пост)
в этом случае operator+ должен быть friend-ом, а не member-ом

да я так и сделаль..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)