2009-02-02 77 views
2

問題可能是主觀的,所以什麼時候爲一個類定義ostream運算符<<?

std::ostream& operator << (std::ostream & o, const SomeClass &a) { 
    return o << a.accessor().. ; 
} 

語法你平時定義此爲你寫的類,你什麼時候避免編寫爲類這位朋友的功能。

回答

1

我從來沒有在生產代碼中重載過這個。儘管如果你記錄了很多,你可能會想要做到這一點,但這很有用。

4

我只會在與流式處理有關的任何操作時,或者在移位時纔會超載運算符< <,並且該類是純數字。爲了在你的代碼中寫入一些東西,我認爲它很好。我認爲,其他任何事情都會引起混淆,我最好使用成員函數來實現其他目的。另外一個應用程序,我想我還是會做作爲一個例外,在做這樣的事情:

StringList list; 
list << "foo" << "bar" << "baz"; 

這是Qt的是如何與它的字符串列表做它,我覺得這相當不錯。

+0

哇,這很好。 – 2009-02-02 14:09:45

8

如果我要流一類我通常這樣寫:

std::ostream& operator << (std::ostream& o, const SomeClass& a) 
{ 
    a.print(o); 
    return o; 
} 

然後進行打印,知道如何將類序列化到一個流上SomeClass的一個const方法。

+1

如果您將運算符<<作爲函數模板,那麼您只需要編寫一次它就可以用於任何具有打印(ostream&)成員函數的類。 – Ferruccio 2009-02-02 12:54:44

3

Martin的答案上面的一個好處是,你也可以免費獲得多態。如果您製作print(ostream&) a 虛擬函數,那麼運算符也會像虛函數那樣工作!至於什麼時候重載操作符,只要你認爲類應該可以寫入流(文件,套接字等等),就可以這樣做。這甚至可能僅用於調試目的。能夠輸出一個類的內部結構通常很有用,所以重載這個運算符沒有真正的缺點。

0

如果且僅當我打算使用該運算符時,我才執行此操作。這幾乎從來沒有......我沒有實施它的原因是沒有使用它。如果它的公開使用包括它的完整性,但我肯定不會將它包含在你自己的項目的每個類中,因爲大多數情況下,你不需要輸出一個類到一個流。例如如果你將自己的入口包裝在一個班級中,提供這個操作員將毫無意義。

2

我會考慮將它用於類似日誌記錄的事情。所以,你可以這樣做:

SystemLog systemLog; 
systemLog << "Processing Item #15"; 
systemLog << "Error 0014: Bad things happened."; 
systemLog << system.executeCommand(cmd); // returns a result string 

或許聯網爲:

NetworkInterface networkInterface; 
string message("Hello World! I'm a server."); 
networkInterface << message; 

課程實施的這些東西作爲正常的功能,還可以和可能只是理想。一般來說,您應該提防操作員超載。只有在它真的適合時才使用它。

0

我這樣做的頻率很高,因爲它可以將對象轉儲到日誌中進行調試,非常方便。

相關問題