2016-12-17 93 views
1

我在寫一個我想要轉換成字符串的類。toString函數或(std :: string)在C++中拋出過載

我應該做這樣的:

std::string toString() const; 

或者這樣:

operator std::string() const; 

什麼方式所接受?

+2

你在使用C++ 11嗎?如果是這樣,你可以使用一個明確的轉換操作符。否則,你應該更喜歡前者(在C++ 98或C++ 03上)。 –

+0

@CodyGray我更正了我的標籤 – tomgrin10

+1

我也考慮過一個自由函數'std :: string to_string(const Type&)',因爲對於整數和算術數據類型有'std :: to_string'。並將其保存在與班級相同的命名空間中。 – Maikel

回答

2

在標準庫中具有「字符串」表示形式的類(例如std :: stringstream)使用.str()作爲成員函數來返回文本。如果您希望能夠將您的課程用於通用代碼,那麼最好使用相同的約定(toString是「爪哇」和ToStringSharpish」)。

關於使用轉換運算符,只有在您的類專門設計爲與字符串表達式中的字符串進行交互操作時纔有意義(轉換爲字符串實際上是「升級」,如int隱含地變爲long)。

如果您的班級「降級」爲字符串(這樣做會丟失信息),最好讓演員操作員明確(explicit operator std::string() const)。

如果它與字符串語義無關,而且必須偶爾轉換,請考慮明確命名的函數。

需要注意的是,如果a是一個變量,你必須考慮它的使用語義是:

如果你的類無關對字符串,但只參加I/O ,然後再考慮這個想法不轉換爲字符串,而是寫一個流,通過的手段......

friend std::ostream& operator<<(std::ostream& stream, const yourclass& yourclass) 

,這樣就可以做...

std::cout << a; 

std::stringstream ss; 
ss << a; // this makes a-to-text, even respecting locale informations. 

...甚至可能不需要分配任何與字符串相關的內存。

+0

「'toString'是」* Javanese *「或」* Sharpish *「」 - 只有「爪哇人」。 C#(實際上.NET)使用'ToString'。 – hvd

+0

@hvd:坦克你。固定。 –

相關問題