2015-10-24 2 views
0

У меня есть классный комплекс, и я бы хотел, чтобы оператор < < мог печатать свои частные переменные.Оператор-посредник << без перегрузки

class complex 
{ 
    double re, im; 

    public: 
    friend ostream operator <<(ostream &out); // What's wrong? 
}; 

Возможно ли это?

+1

'operator <<' - это двоичный оператор, и вы попытались объявить его только одним операндом. При перегрузке вы не можете изменить arity операторов C++. Вы должны объявить его корректно как двоичный оператор, например: 'friend ostream operator << (ostream & out, const complex & what_to_output);' –

+1

Ваш заголовок говорит «без перегрузки». Любое объявление 'operator <<' перегружает. –

ответ

1

Объект быть outputed должен быть передан в качестве параметра:

friend ostream& operator <<(ostream &out, const complex& obj); 

Затем вы должны реализовать функцию, возможно, как это:

ostream& operator <<(ostream &out, const complex& obj) 
{ 
    out << obj.re << ";" << obj.im; 
    return out; 
} 
+0

Вам также необходимо вернуться по ссылке. –

+0

Вы правы, отредактированы ... ;-) Спасибо – jpo38

3

Вы должны пройти два аргумента в operator <<() (ссылку на объект потока и один на объект, который вы хотите передать), и вы обычно всегда хотите, чтобы return ссылалась на поток, переданный таким образом, чтобы вы могли передать вывод другому вызову operator<<(). Так что вам нужно что-то вроде:

friend ostream& operator <<(ostream &out, const complex& rhs); 
+0

Вам также нужно вернуться по ссылке. –

+0

@AlanStokes Совершенно верно, отредактированный ответ. Благодарю. –

+0

Строго говоря, вы не * должны * вернуть ссылку. Вам не нужно ничего возвращать. Но если вы собираетесь вернуть объект ostream, который был передан (что вам нужно, чтобы оправдать оправданные ожидания того, что потоковые операции могут быть привязаны), он должен быть по ссылке, потому что 'ostream' не копируется , –

0

да это возможно, но вы допустили ошибку в списке параметров оператора, есть два параметра не один, один для ostream, который компилятор автоматически распознает его и здесь он должен быть ostream , второй будет типом класса, который вы будете использовать после cout < < classType здесь сложный, кстати посмотрите на это cout<<Complex cout - это первый параметр, поэтому вы должны использовать этот код, он будет работать.

#include <ostream> 
using std::ostream; 

class Complex 
{ 
public: 
    friend ostream &operator <<(ostream &out, Complex &cmplx) 
    { 
     out << cmplx.im << "\t" << cmplx.re; 

     return out; 
    } 

private: 
    double re, im; 
}; 

int main() 
{ 
    Complex complex; 

    cout<<complex; 

    return 0; 
} 

будет выводить значение re и im.

Смежные вопросы