2010-09-14 207 views
2

我想重載< <運營商在Line類,所以我可以使用COUT這樣打印的對象:重載運算符<<在C++

cout << myLineObject << endl; 

,但是這是行不通的:

class Line{ 
public: 
    float m; 
    float b; 
    string operator << (Line &line){return ("y = " + line.m + "x + " + line.b);}; 
}; 

我得到:

Invalid operands of types 'const char [5]' and 'float' to binary 'operator+' 

我也試圖與stringstream但我得到甚至米礦石錯誤。這樣做的正確方法是什麼?

感謝;)

回答

9

operator<<必須是非成員函數,因爲流是左邊的參數。在你的情況,因爲數據成員是公開的,可以在類外實現:

std::ostream& operator<<(std::ostream& stream, const Line& line) 
{ 
    return stream << "y = " << line.m << " x = " << line.b; 
} 
3

Google搜索這一塊,看起來很好: Overloading <<

基本上,超載< <運營商IO時,你的函數應該是這樣的:

friend ostream& operator<<(ostream& output, const YourClassHere& p); 

通知,該運算符< <不是類成​​員,而是外部函數(如果需要它可以是朋友)。這樣的函數應該使用輸出來寫入並返回它,這樣就可以鏈接它。

+0

這是正確的聲明,但是您沒有解決函數體中的問題。 – 2010-09-14 13:50:19

+0

如何寫身體在我給出的鏈接中描述。例如有關於Point類的例子,它幾乎與問題(Line)完全相同。所以我想出了一個鏈接到材料而不是c&p的概念(或者那裏描述的想法)。 – 2010-09-14 13:56:58

16

正確的方式被列出無處不在超載<<進行了討論,你幾乎已經錯過了所有的。

標準聲明是ostream & operator<<(ostream & s, const & Line l);它不能是一個成員函數,它需要返回一個對ostream的引用,這樣才能像正常情況下鏈接<<

的定義,你的情況,會是這樣

ostream & operator<<(ostream & s, const & Line l) 
{ 
    return s << "y = " << l.m << "x + " << l.b; 
} 

請注意,您返回傳入ostream,並打印你喜歡用<<運營商,而不是使用+操作。這很簡單,如果你按照這個 表格。

在這種情況下,數據成員是公開的(通常這不是一個好主意),因此不存在訪問問題 。如果您需要獲取無法訪問的值(因爲 它們是private而未公開在公開界面中),您需要在類定義中聲明 運算符爲friend

+0

'l'應該是'line'作爲第二個參數(或者'line'應該是'l'在函數體中)。 – 2010-09-14 14:19:13

+0

@Steven:謝謝。我已編輯匹配。 – 2010-09-14 14:40:44

0

這裏的錯誤是無關的操作符重載,但一旦解決,你可能有更多的問題。發生此錯誤是因爲沒有定義operator+,其參數爲const char[5]float。由於您試圖連接這四個參數的字符串形式,因此您必須以編譯器可以理解的方式執行此操作,例如,

ostringstream concat; 
concat << string("y = ") << line.m << string("x + ") << line.b; 
return concat.str(); 

一旦你過去這一點,你可以在你的<<超載邏輯工作。

0

你可以這樣說:

class Line{ 
    public: 
    float m; 
    float b; 
    friend ostream& operator<< (ostream& out, Line& object) { 
    out << object.m << endl; 
    out << object.b << endl; 
    return out; 
    } 
}; 

然後,你可以這樣做: COUT < < your_Line_object < < ENDL;

0

其他已經說明了正確的方法。我想我會提到你做錯了什麼。

你定義一個操作,採用兩個線對象:

Line a; 
Line b; 
string c = a << b; 
// c would have the string values for line b 
// the values of line a would be ignored. 

當然,這不是你所看到的錯誤。這是由行"y = " + line.m造成的。 「y =」是一個char [5]。 amd line.m是一個浮點數,並且沒有運算符+它將這兩個(這不是基本 - 或C#)。

問題是,C++沒有簡單的方法將非字符串值「添加」到字符串中。這就是爲什麼我們使用cout <<的慣例。