1

回避できる場合は、.header にあまり多くのクラスを含めないように言われました。代わりに、それらを .cpp に含めます。それを行うために、彼らは私に次のようなプロトタイプクラスを作成するように言いました:

class abc;

それ以外の:

include "abc.h"

ただし、これは abc クラスが属性または戻り値として使用されていない場合に備えてです。パラメータならプロトタイプが使えるのに…なんでだろう?

また、.h ファイルに非常に多くのヘッダーを含めるのはなぜ悪いのでしょうか?

ありがとう

4

5 に答える 5

2

パラメータの場合、プロトタイプを使用できます...これはなぜですか?

宣言されたクラスの内部構造にアクセスする必要がない場合はいつでも、前方宣言を使用できます。たとえば、ポインターや参照を宣言したり、パラメーターとして渡したりする場合などです。前方宣言を使用して、クラスを継承したり、そのメンバー関数を呼び出したり、そのメンバーにアクセスしたり、非ポインター/参照型のメンバーを宣言したりすることはできません。これは、クラスの内部構造をコンパイラーが認識している必要があるためです。上記のいずれかを実行します。

.hファイルに非常に多くのヘッダーを含めるのはなぜそれほど悪いのですか?

これ自体は普遍的に「悪い」わけではありませんが、多くのコンパイラではコンパイルプロセスが遅くなる可能性があるため、インクルージョンを最小限に抑えるのが一般的です。最新のコンパイラには、影響を最小限に抑えるための便利な機能(プリコンパイル済みヘッダーなど)があるため、実際的な問題よりも美的な選択になる可能性のある前方宣言を使用します。

于 2013-03-21T11:31:22.360 に答える
2

クラスを前方宣言すると、次のようになります。

class abc;

は不完全な型になり、不完全な型でできることは限られています。たとえば、クラスのメンバーの知識、またはそのサイズの知識さえも必要とするものはすべて、完全な宣言を必要とします。

他のヘッダーからのヘッダーを含めることに関しては、次の 2 つの反論を考えることができます。

  1. ビルド時間の改善。
  2. 依存関係が少ない。

最初のものは、プロジェクトのサイズ、コンパイラ、ハードウェアなどに応じて関連する場合と関連しない場合があります.2番目のものも、クラス間の依存関係を実際に削減しないため、疑わしいです.

前方宣言を使用する必要ある状況の 1 つは、異なるヘッダーで定義された 2 つのクラス間に循環依存関係がある場合です。

于 2013-03-21T11:29:48.323 に答える
1
class abc;

型を前方宣言すると、コンパイラはそれをIncomeplete 型として扱い、その型のメモリ レイアウト/構成に関する情報を持ちません。したがって、この情報を知る必要がある操作をコンパイラに実行するように依頼することはできません。

不完全型では、次のことはできません。

  • メンバーを宣言するために使用します。
  • この型を使用して関数またはメソッドを定義します。

しかし、不完全型を使用すると、次のことができます。

  • メンバーを不完全な型へのポインターとして宣言します。
  • 不完全な型を受け入れる/返す関数またはメソッドを宣言します。
  • 不完全な型へのポインターを受け入れる/返す関数またはメソッドを定義します (ただし、そのメンバーは使用しません)。

.h ファイルに非常に多くのヘッダーを含めるのはなぜ悪いのでしょうか?

それは悪いです:

  • ヘッダーを含めると、ヘッダーの内容が現在の翻訳単位にコピー ペーストされるだけです。これにより、コンパイル時間が長くなり、依存関係が構築されます。
于 2013-03-21T11:30:13.243 に答える
0

多くのヘッダーを含めるのは悪いことです。ヘッダーの1つを変更すると、ファイルもコンパイルする必要があるためです。これは問題のようには聞こえないかもしれませんが、大規模なプログラムの場合、コンパイルとリンクに多くの時間(数時間)かかる可能性があります。

于 2013-03-21T11:31:05.310 に答える
0

コンパイラが知る必要があるのは、コードを生成する必要があるまで、構成ではなく名前だけです。

そのため、ロードと解析を必要としないため、前方宣言が適しています。

ところで-メイクファイルが再コンパイルを開始する必要がないことが役立ちます。

于 2013-03-21T11:41:01.430 に答える