2015-10-24 100 views
0

我有一個班級複雜,我想操作員< <可以打印它的私有變量。朋友操作員<<沒有超載

class complex 
{ 
    double re, im; 

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

這可能嗎?

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

然後,你要實現的功能,可能是這樣的::

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

'operator <<'是一個二元運算符,您試圖用一個操作數聲明它。超載時,您不能更改C++運算符的組合。您必須正確聲明它爲二元運算符,例如:'friend ostream operator <<(ostream&out,const complex&what_to_output);' –

+1

您的標題說「沒有超載」。任何'operator <<'聲明都是重載。 –

回答

1

對象被outputed必須作爲參數傳遞對流對象的引用,以及對要流式傳輸的對象的引用),並且您通常總是希望return對傳入的流的引用成爲可能,以便將輸出傳遞給另一個operator<<()調用。所以,你需要這樣的東西:

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

您還需要通過參考返回。 –

+0

你是對的,編輯... ;-)謝謝 – jpo38

3

你有兩個參數傳遞到operator <<()

+0

你也需要通過參考返回。 –

+0

@AlanStokes相當正確,編輯答案。謝謝。 –

+0

嚴格地說,你不必*返回一個參考。你根本不需要返回任何東西。但是如果你要返回傳入的ostream對象(爲了滿足流操作可以被鏈接的合理期望,你應該這樣做),它需要被引用,因爲'ostream'是不可複製的。 –

0

是的,它是可能的,但您在操作參數列表裏的錯誤,還有在兩個參數不是一個,一個ostream的,編譯器會自動識別它,並在這裏它必須是ostream的,第二個將是你在cout之後使用的類類型< < classType在這裏是Complex,順便看看這個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; 
} 

將打印的reim值。