2011-02-02 3 views
21

私はそれが全体のラインを取得するのではなく空白で停止し忘れたので2つの異なるgetline()関数が存在するのはなぜですか?

std::string s; 
cin >> s; 

は、私は自分自身を呪うC++コード行の迅速なスニペットを行うたびに。

その後、getlineを覚えるには、私は常に2つの品種へと混乱してしまう:

std::string s; 
getline (std::cin, s); 

と:

char cs[256]; 
std::cin.getline (cs, sizeof (cs)); 

は、実際にデータ型以外のこれら二つの違いはありますか?

私にはC++の方法が前者である必要があります。とにかく、代わりに ヌル終了文字配列の代わりに、実際の文字列を使用する必要があることを考えれば、どのような状況で私は後者を使用しますか?

入力は実際には入力ストリームの範囲でなければならないので、なぜ前者の部分はistreamではありませんか?

答えて

8

スタンダードライブラリはIOStream、String、STLの3つの部分から成っていることに注意してください。いくつかはお店やCヘッダーに投げ込まれています。

疎結合している部分は奇妙に見えません(私はそうではないと思いますが)。

std::string::lengthstd::string::size(後者はSTLとのインターフェイス互換性のために追加され、前者は古いコードとの互換性のために残されています)。

+3

私はこのフレーズが "疎結合"であると思っています。 "不十分に統合された"という言葉は否定的な意味を持っています。 std :: stringを必要とせずに 'std :: istream'を使わずに' std :: istream'を使うのは良いことだと思います。 –

+2

@Charles:「提出」をする前に正反対の変更を加えたことを教えてもらえませんか?私は個人的にはより統一された標準ライブラリを好みました。 C++標準ライブラリは、 "有機的成長"の典型です。 –

+2

@Charles:私は間違いなくiostreamsと文字列が結合していないと間違っていると思います。つまり、iostreamは基本的なレベルで文字列を操作することに依存しています。依存関係を減らすことは、文字列クラスでなければ、C-stringで動作するメンバ関数を使用できなくすることができます。 – Puppy

1

iostreamsライブラリ内のgetlineバリアントは文字列をターゲットとしてサポートしていないため、文字列ライブラリではバリアントが定義されています。

22

グローバルgetline()関数は、C++ std::stringオブジェクトと共に動作します。

istream::getline()のメソッドは、「古典的な」C文字列(charへのポインタ)で動作します。

+0

唯一入力した文字列が文字列の場合、私の素敵な 'object.method()'ビューを破壊するのではなく、なぜ 's.getline(std :: cin)'ではないのですか? – paxdiablo

+3

@paxdiablo、それはセマンティクスの問題かもしれません: 'getline()'は文字列演算ではなく、 'std :: string'クラスのメソッドにするのは奇妙です。 –

+4

私の推測はは約を知らないので、std :: cinはstd :: stringを返すメソッドを持つことができません。 – Grozz

1

はい最近のC++の方法は、空き関数を使用してstd :: stringを入力することです。

しかし、IOStreamはstd :: stringよりもはるかに長い歴史を持っています(標準バージョンは、少なくとも同じデザインの3番目の化身です)。

(getlineメンバーには動的割り当てが含まれていないという利点がありますが、その特性は時間には便利ですが、スクラッチデザインからそれを正当化するには不十分です)。

6

これは一般的なインターフェイス設計上の問題です。 cin.getline()は要求を行う自然な方法ですが、ストリームコードを<string>に依存しないようにするには、cin.getline(std::string&)機能を使用できません。文字列がスコープに取り込まれた後、自立型のgetline(cin, s)を後で追加することができます。とにかく#includeには何もないので、char*の問題ではありません。

言語によっては、後のコードで既存のクラス(Rubyなど)にさらに機能を追加することができますが、他の方法では非局在化が問題になり、保守性が損なわれる場合もあります。もちろん、最小限のメンバ関数と多くの自立した関数の一般的な議論があります。私は個人的には、インターフェイスを直観的で表現力がないようにするべきではなく、それぞれ独自のものにするべきだと思います。

+0

これは、このデカップリングが設計上の理由を明示的に述べている唯一の答えと思われます。 'string'が' iostream'よりも新しいという単なる事実は、結局のところ、なぜ後者が改造されなかったのかについての十分な説明ではありません。私は、決定があまり議論の余地がない時間があったと仮定し、未使用の 'string'クラスを持つオーバーヘッドは比較的大きかった。 –

関連する問題