Iostreamを使用するクラスAがある場合、iostreamのincludeステートメントをA.hまたはA.cppに配置する必要がありますか?
これはいくつかの論争の領域です。私の好みは、各ヘッダーが独立できるようにすることです。そのため、他のヘッダーが必要な場合は、それらを含めます。つまり、クライアントコードに<iostream>
(またはその他)を含める必要がある場合は、ヘッダーでそれを処理する必要があります。 OTOH、iostreamのユーザーが完全に非表示になっているため、クライアントコードにそれを含める必要がない場合は、実装ファイルにのみ含める必要があります。
多くの場合(特にヘッダーが頻繁に変更される可能性がある場合)、ヘッダーにヘッダーを含めないようにします。このような場合、PImplイディオムは依存関係をヘッダーから取得するのに役立ちます。
<iostream>
を含める必要がある場合は、クライアントに好意を示し、#include <iosfwd>
ではなく<iostream>
を使用できるかどうか検討してください。これにより、コンパイル時間がかなり改善されます。
必要な場所に含めます。クラスの宣言で<iostream>
で定義されたもの(メンバー変数、メンバー関数パラメーター、戻り値の型など)を使用する場合は、Hファイルにある必要があります。実装でのみ使用する場合-CPPで。
それをcppに含めます。そうすれば、A.hを含む可能性があるがiostreamを必要としない他のcppファイルに含まれる可能性はありません。もちろん、何らかの理由でない限り、iostreamを必要とするヘッダーファイルに何かがあります。しかし、それが事実である場合、他の何か間違ったことをしているかもしれません...
場合によります。
seヘッダーファイル内のクラスの場合、(明らかに)ヘッダーファイル内で必要です。
クラス宣言だけを使用する場合は、不完全な型を使用できます。その場合は、<iosfwd>
ヘッダーファイル、および<iostream>
cpp内
必要な場所で使用してください。
クラス宣言がヘッダーの型を参照している場合は、そこに含める必要があります。実装のみの場合は、cppファイルに含めることができます。