2011-03-31 65 views
4

我有一個類Terminallog,這是超載運算符< <。如果我做以下運算符「<<」到一個指針

Terminallog clog(3); 
clog << "stackoverflow.com is cool" << endl; 

一切工作正常。 「stackoverflow.com很酷」是在一個很好的彩色方式打印到屏幕上,正是Terminallog應該做的。

現在我嘗試

Terminallog* clog = new Terminallog(3); 
clog << "stackoverflow.com is cool" << endl; 

,給了我一個編譯器錯誤:

error: invalid operands of types ‘Terminallog*’ and ‘const char [5]’ to binary ‘operator<<’ 

我可以看到,它是經過「< <」操作符的指針問題,但我怎麼能獲得與非指針版本相同的行爲?我可以簡單地取消引用指針,但是這會創建對象的本地副本(這對性能不利?)

因此,我不知道什麼是正確的方法嗎?

在此先感謝

ftiaronsem

+3

我不認爲取消引用指針會創建對象的本地副本。 – 2011-03-31 09:18:00

回答

8

解引用指針寫

*clog << "My message" << endl; 

創建對象的副本被指向。通常,指針取消引用不會創建副本,而創建副本的唯一方法是顯式創建副本,通過值將對象傳遞給函數,或者通過值從函數返回對象。上面的代碼與指針解引用可能是你正在尋找的。

+1

爲了完整性,取消引用指針創建引用(語義)。 – 2011-03-31 11:34:03

2

取消引用指針不創建一個副本,它會創建一個參考。你可以取消它,並得到正確的行爲,不要複製。

1

簡單:(*clog) << "stackoverflow.com is cool" << endl;

這並不創造clog副本。

+1

您有語法錯誤。 – 2011-03-31 09:18:20

+0

哎呀,抄了兩遍。 – MSalters 2011-03-31 09:28:03

4

事實上,解引用指針會給你一個參考,而不是副本,所以你很好。 (試圖複製流將而且應該失敗,無論如何,流不是容器,但數據流。)

*clog << "text" << std::endl; 

你不能寫一個免費的(「全局」)功能operator<<採取指針 - - TerminalLog在左側,其他的東西在右側,因爲語言要求至少有一個操作數爲operator<<爲類或枚舉類型,並且您的RHS參數通常不會是一個。

+0

語言不允許。 – Puppy 2011-03-31 09:48:01

+0

@DeadMG:哎呀,你當然是對的 – 2011-03-31 09:48:56

+0

你推理是錯誤的。操作數的一端沒有意義。重要的是至少有一個操作數是類或枚舉類型。 (HTTP:// ideone。com/4zhQt) – visitor 2011-03-31 10:26:56

1
Terminallog* clog = new Terminallog(3); 
Terminallog& clog_r = *clog; 
clog_r << "stackoverflow.com is cool" << endl; 
+0

你的意思是'Terminallog&clog_r = * clog;' – CharlesB 2011-03-31 09:21:40