web-dev-qa-db-ja.com

stdライブラリをヘッダーまたはcppに含めますか?

Iostreamを使用するクラスAがある場合、iostreamのincludeステートメントをA.hまたはA.cppに配置する必要がありますか?

20
user695652

これはいくつかの論争の領域です。私の好みは、各ヘッダーが独立できるようにすることです。そのため、他のヘッダーが必要な場合は、それらを含めます。つまり、クライアントコードに<iostream>(またはその他)を含める必要がある場合は、ヘッダーでそれを処理する必要があります。 OTOH、iostreamのユーザーが完全に非表示になっているため、クライアントコードにそれを含める必要がない場合は、実装ファイルにのみ含める必要があります。

多くの場合(特にヘッダーが頻繁に変更される可能性がある場合)、ヘッダーにヘッダーを含めないようにします。このような場合、PImplイディオムは依存関係をヘッダーから取得するのに役立ちます。

<iostream>を含める必要がある場合は、クライアントに好意を示し、#include <iosfwd>ではなく<iostream>を使用できるかどうか検討してください。これにより、コンパイル時間がかなり改善されます。

25
Jerry Coffin

必要な場所に含めます。クラスの宣言で<iostream>で定義されたもの(メンバー変数、メンバー関数パラメーター、戻り値の型など)を使用する場合は、Hファイルにある必要があります。実装でのみ使用する場合-CPPで。

3
littleadv

それをcppに含めます。そうすれば、A.hを含む可能性があるがiostreamを必要としない他のcppファイルに含まれる可能性はありません。もちろん、何らかの理由でない限り、iostreamを必要とするヘッダーファイルに何かがあります。しかし、それが事実である場合、他の何か間違ったことをしているかもしれません...

2
Kurtis Nusbaum

場合によります。

seヘッダーファイル内のクラスの場合、(明らかに)ヘッダーファイル内で必要です。

クラス宣言だけを使用する場合は、不完全な型を使用できます。その場合は、<iosfwd>ヘッダーファイル、および<iostream> cpp内

1
sehe

必要な場所で使用してください。

クラス宣言がヘッダーの型を参照している場合は、そこに含める必要があります。実装のみの場合は、cppファイルに含めることができます。

0
Joe