2012-07-01 4 views
3
#include <iostream> 

using namespace std; 

struct info { 
    info(int x, int y) : x(x), y(y) {} 
    int x; 
    int y; 
}; 

ostream& operator<<(ostream& out, const info &myinfo){ 
    out << myinfo.x << " " << myinfo.y; 
    return cout; 
} 

int main() { 
    info a(1,2); 
    info b(3,4); 
    cout << a << " " << b << endl; 
} 

Выходной сигнал вышеуказанной программы кажется прекрасным даже при неправильной перегрузке operator <<.Возвращаемое значение перегруженного <<

Может ли кто-нибудь сказать мне, что является следствием этой проблемы с перегрузкой? Я знаю, что функция перегрузки должна возвращать out вместо cout, но как выглядит вышеприведенная версия?

+2

не связаны с перегрузкой операторов, но у вас есть ошибка в конструкторе: Информация структура { данные (INT х, Int у): х (х), у (у) {} // здесь меняется на х , b изменено на y int x; int y; }; – CapelliC

+0

lol. Да только опечатка – user1494533

ответ

1

Он будет работать в этой ситуации, очевидно, потому что целевой поток равен cout. Он будет ломаться в других ситуациях.

+0

Можете ли вы привести мне пример? – user1494533

+0

@ user1494533: Каждый раз, когда вы не переходите к 'cout'! Вместо этого попробуйте использовать 'cerr' или' std :: stringstream'. –

6

В этом случае, поскольку вы проходите мимо std::cout перегруженному operator<<, нет никакой разницы в поведении. В целом, однако, вы бы вызвать " " << b << std::endl получить отправлены std:cout, в то время как ваш a бы к тому, что вы прошли в

Например:.

info a(1,2); 
info b(3,4); 
std::ostringstream ss; 
ss << a << " " << b << std::endl; 

приведет a идти к ss.

+0

спасибо за ваш пример! – user1494533

1

Это просто для работы здесь, потому что out и cout относится к одному и тому же объекту.