2014-01-14 3 views
0

Я возвращаю std::ostream каждый раз, когда я собираюсь создать оператора, такого как оператор std::string, чтобы показать значение (без оператора), но я не знаю почему. Если std::ofstream используется в качестве функции-функции функции-оператора (std::cout), как я могу его вернуть, когда я должен это делать и почему?Когда мне следует возвращать std :: ostream?

Пример:

class MyClass 
{ 
    int val; 
    std::ostream& operator<<(const std::ostream& os, const MyClass variable) 
    { 
     os << variable.val; 
    } 
} 

На std::string:

std::string a("This is an example."); 
std::cout << a; 
+4

Пожалуйста, дать хотя бы конкретные примеры. Не совсем понятно, что вы спрашиваете. –

+0

«Строковый оператор», используйте функцию «ofstream as function» ??? Что, черт возьми, это значит? – texasbruce

+0

@texasbruce Когда я говорю 'std :: ofstream' как функцию, я имею в виду' std :: cout << variable' (см. Edit). –

ответ

6

Это обычное для возвращения ссылки на ostream при перегрузке <<, чтобы позволить сцепление. Это:

s << a << b; 

эквивалентен функция вызывает

operator<<(operator<<(s,a),b); 

и работает только потому, что внутренний вызов возвращает подходящий тип, чтобы быть аргументом для внешнего вызова.

Для реализации этого, просто взять поток аргументов по ссылке, и возвращает тот же поток по ссылке, либо непосредственно:

std::ostream & operator<<(std::ostream & s, thing const & t) { 
    // stream something from `t` into `s` 
    return s; 
} 

или вернулся из какой-либо другой перегрузки:

std::ostream & operator<<(std::ostream & s, thing const & t) { 
    return s << t.whatever(); 
} 
Смежные вопросы