2010-12-13 9 views
7

getline関数には、メンバー関数であるcharacter versionと、文字列を受け取るglobal versionがあります。なぜ彼らは両方のメンバー機能ではないのですか?現在の方法では文字列バージョンがないように見えます。getlineの文字列バージョンが非メンバ関数なのはなぜですか?

+0

最初は直感的ではないかもしれませんが、クラスに機能を追加する最もオブジェクト指向の方法はフリー関数を使用するという考えを支持する作者がいます。この[Guru Of The Week#84](http://www.gotw.ca/gotw/084.htm)を読んでください。問題は、なぜ既存のライブラリメンバ関数の一部がフリー関数ではないのでしょうか? –

答えて

5

istream& istream::getline(char* s, streamsize n)は、ストリームインターフェイスの一部です。

istream& getline(istream& is, string& str)は、(ちょうどistream &operator>>(istream&, string&)等)stringライブラリから拡張方法です。 fstream::open()std::string引数ではなく、むしろconst char*を取らないよう

この設計は、おそらく、文字列からのiostreamを切り離すために選ばれました。

2

iostreamクラスの実装は文字列に依存してはならないためです。

1

ストリームライブラリの問題は、それがうまく設計されていないことです。特に、メンバ関数getlineは全く存在してはいけません。自由な関数getlineは彼が使用するのに適している、それはいくつかの利点があります:それはメンバ関数ではなく、安全であり、生のバッファでは働かず、推測を必要としません。

member関数とfree関数の両方がistreamパブリックインターフェイスの一部であることに言及する必要があります。

関連する問題