getline
関数には、メンバー関数であるcharacter versionと、文字列を受け取るglobal versionがあります。なぜ彼らは両方のメンバー機能ではないのですか?現在の方法では文字列バージョンがないように見えます。getlineの文字列バージョンが非メンバ関数なのはなぜですか?
7
A
答えて
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パブリックインターフェイスの一部であることに言及する必要があります。
関連する問題
- 1. なぜis_lock_freeはメンバ関数ですか?
- 2. 関数からC文字列を返すと、ランダムな文字が返されるのはなぜですか?
- 3. 非メンバ関数ポインタが必要なときにメンバ関数ポインタを渡す?
- 4. `eval`が非文字列で動作するのはなぜですか?
- 5. なぜポートは整数ではなく文字列ですか?
- 6. 文字列xに文字がある場合、なぜこの関数を実行しないのですか?
- 7. Vimの:getlineのと非ASCII文字
- 8. constexprクラスの非静的配列メンバをメンバ初期化する必要があるのはなぜですか?
- 9. 文字列が同じでないのはなぜですか?
- 10. 文字列が値でないのはなぜですか?
- 11. バッチなぜドライブ文字が非大文字になるのですか
- 12. seekgがgetlineで動作しないのはなぜですか?
- 13. なぜgccとclangはメンバ関数のテンプレートパラメータに非常に異なるコードを生成するのですか?
- 14. なぜこのメンバ変数をこのメンバ関数で設定できないのですか?
- 15. C++でメンバ関数を宣言できないのはなぜですか?
- 16. C++:getline関数を持たない文字列に空白を入れた
- 17. PHP致命的なエラー:文字列のメンバ関数fetch_assoc()を呼び出す
- 18. 致命的なエラー:文字列のメンバ関数fetch_assoc()を呼び出す
- 19. コードが文字列内の数字や文字を正しく識別しないのはなぜですか?
- 20. メンバ関数displayに文字列を返しますか? C#
- 21. 文字列のサイズがメインと関数で異なるのはなぜですか?
- 22. ファイルからの文字列が一般的な文字列と等しくないのはなぜですか?
- 23. なぜ関数へのポインタのサイズがメンバ関数へのポインタのサイズと異なるのですか?
- 24. constexpr非メンバ関数のグローバル非定数変数にアクセスするのがなぜ合法でないのですか
- 25. 2つの異なるgetline()関数が存在するのはなぜですか?
- 26. 演算子のオーバーロード:メンバ関数と非メンバ関数の比較?
- 27. Set-ADUserコマンドで数値文字列で文字列を使用できないのはなぜですか?
- 28. ヘッダーファイルのメンバでない関数を非表示にする
- 29. Symfony文字列のメンバ関数format()への呼び出し
- 30. AppDomainSetup.ShadowCopyFilesが文字列であるのはなぜですか?
最初は直感的ではないかもしれませんが、クラスに機能を追加する最もオブジェクト指向の方法はフリー関数を使用するという考えを支持する作者がいます。この[Guru Of The Week#84](http://www.gotw.ca/gotw/084.htm)を読んでください。問題は、なぜ既存のライブラリメンバ関数の一部がフリー関数ではないのでしょうか? –