1

正直なところ、ヘッダー ファイルの関数 (および場合によってはデータ メンバー) 宣言に含まれるキーワードと、実装ファイルに含まれるキーワードとの間で混乱しています。

従うべき一連のルールは何ですか? 例えば

(コメントごとに更新)

  • 関数が「インライン」として宣言されている場合を除き、ヘッダー ファイルには実装が含まれていません。
  • データ メンバーには、型が static、const、int/enum (C++11 を除く) でない限り、既定値は含まれません。
  • Public/private/protected は通常、ヘッダー ファイルに表示されます
  • 「静的」は通常、実装ファイルではなく、ヘッダー ファイルに表示されます。

従うために使用できる他の規則はありますか? コンスト?

継承についてはどうですか?「仮想」はヘッダーファイルにのみ入ると思いますか? クラス A からクラス B に仮想関数を継承する場合、クラス B のヘッダー ファイルはオーバーライドする仮想関数を宣言する必要がありますか? クラス A の純粋仮想関数はどうですか? クラス B でオーバーライドする場合、派生クラスのヘッダー ファイルに純粋仮想関数の定義を含める必要がありますか?

4

2 に答える 2

2

それがどのように機能するかを理解せずに、正式なルールを作成しようとしているようです。しかし、それは本当に簡単です。プリプロセッサが #include ディレクティブを見ると、それをそのファイルの内容に置き換えるだけです (コマンドでファイル全体をコピーしてここに貼り付けるようなものです)。したがって、正式なルールを作成する代わりに、自問自答してください: このステートメントは、このヘッダーを使用するすべての .cpp ファイルに表示する必要がありますか? それらはまだコンパイルされますか?本当にどこでも必要ですか、それとも実装を提供する .cpp ファイルにのみ含めることができますか? 答えが「はい」の場合、このステートメントはヘッダーに移動し、「いいえ」の場合は .cpp 実装ファイルに入れます。

于 2013-03-01T13:30:22.170 に答える
1

C および C++ での#includeステートメントは、あなたが信用しているよりもはるかに単純ですinclude。'd ファイルの内容を取得し、インクルード ファイルに直接ダンプします。これは何でもかまいません (私の仕事には多くの新人開発者がいます。ディスク上のファイルであれば、ある時点で誰かが試みたincludeことがあります): .cpp ファイルですらあります。自分でそれを証明したい場合は、含まれているファイルの内容をコピーして貼り付けることができますinclude-すべてが以前と同じように機能するはずです。

完全を期すために: プリプロセッサがすべてのインクルード ファイルを要求された場所にダンプすると、コンパイラは各ファイルを個別にコンパイルします。これにより、通常、実装のない宣言の束と宣言のない実装の束が残ります。リンカはこれらの参照を整理します。したがって、リンカー エラーが発生した場合は、どこかで何かが一致していないことを意味します。何かを 2 回宣言したか、実装していない可能性があります。

私たちが実際に持っているのは、ヘッダー ファイルに必要なものとソース ファイルに必要なものに関する一連のベスト プラクティスです。通常、ヘッダー ファイルで宣言を行います。言い換えれば、ヘッダー ファイルは、私 (プログラマー) に実装で何を期待するかを伝える必要があります。通常、これらは宣言です。したがって、通常、アクセス修飾子 (public、private、protected) のみがヘッダーに表示されるのはなぜですか。一部のプログラマーは、ヘッダー ファイルにコンストラクターを記述するなどの「奇妙な」ことを行います。これは有効ですが、一般的には期待されていません。コードがどのように機能するかではなく、コードから使用できるものをヘッダーに教えてもらいたいのです。

于 2013-03-01T13:36:32.597 に答える