2010-02-28 14 views
5

我對如何在C++中爲我的類重載流操作符有點困惑,因爲它看起來像是流類中的函數,而不是我的類。什麼是正常的方法來做到這一點?目前,對於「get from」操作員,我有一個定義什麼是正確的方式來超載流操作符<< >>我的班?

istream& operator>>(istream& is, Thing& thing) { // etc... 

哪個工作。在Thing類的定義中沒有提到它。我希望它能夠在實現中訪問我的Thing類的成員 - 我該怎麼做?

回答

9

你的實現很好。您需要執行的唯一額外步驟是聲明你的運營商作爲friendThing

class Thing { 
public: 
    friend istream& operator>>(istream&, Thing&); 
    ... 
} 
+0

謝謝。這是什麼意思,它不是在「公共:」部分? – ghallio 2010-02-28 18:14:53

6

你讓你的operator>> Thing類的朋友。

8

其他的答案是正確的。在情況下,它可以幫助你,這裏有一個代碼示例(source):

class MyClass { 
    int x, y; 
public: 
    MyClass(int i, int j) { 
    x = i; 
    y = j; 
    } 
    friend ostream &operator<<(ostream &stream, MyClass ob); 
    friend istream &operator>>(istream &stream, MyClass &ob); 
}; 

ostream &operator<<(ostream &stream, MyClass ob) 
{ 
    stream << ob.x << ' ' << ob.y << '\n'; 

    return stream; 
} 

istream &operator>>(istream &stream, MyClass &ob) 
{ 
    stream >> ob.x >> ob.y; 

    return stream; 
} 
+2

我會定義運算符<<,如下所示:ostream&operator <<(ostream&stream,const MyClass & ob); – 2015-07-12 08:28:28

2

有幾種方法和正確的真的取決於類做什麼。

通常情況下,允許讀取信息的公共API是有意義的,在這種情況下流媒體運營商不需要訪問私有信息。

也許最流行的方法是宣佈流類功能的朋友的類。

我最喜歡的是提供一個公共的Boost.Serialization樣式模板函數,可用於流式傳輸以及其他任何方式。

相關問題