に含めるので、クラスAを形成:は、前方宣言対ヘッダファイルに含めると、私はクラスBを持っている、と私はメンバーを呼び出したいの.cpp
1.
//A.h
class B;
class A
{
private:
B* m_p;
};
//a.cpp
#include "B.h"
2。
あまりにも依存度の低い小さなプロジェクトには、どちらの方が良いのですか?この2つは似ていますか?
に含めるので、クラスAを形成:は、前方宣言対ヘッダファイルに含めると、私はクラスBを持っている、と私はメンバーを呼び出したいの.cpp
1.
//A.h
class B;
class A
{
private:
B* m_p;
};
//a.cpp
#include "B.h"
2。
あまりにも依存度の低い小さなプロジェクトには、どちらの方が良いのですか?この2つは似ていますか?
それを行うのあなたの最初の方法はa.h
で、class B
の存在が知られてではなく、その定義されていることを意味します。これにより、B
でできることがa.h
に制限されます。たとえば、タイプの変数を持つことができますが、タイプB
の変数はありません(タイプB
の変数を宣言する場合、コンパイラはB
の完全な定義を参照できるため)。また、タイプがB *
の変数がある場合は、ポインタを逆参照できません(そのためにも、B
の定義を知っていなければなりません)。
したがって、これらの問題が発生していない–の2番目の選択–が優先されます。これはほとんどの人がほとんどの時間を使用しているためです。
これは、最初の方法が有用な場合のみです。
.h
ファイルがお互いにが含まれます(ただし、あなたはまた、-警備員について、さらに多くの問題を得ることができ、これは一般的に困難であり、避けることが)場合は、例えば:b.h
が非常に大きくて複雑な場合は、できるだけコンパイルプロセスが遅くなるため、できるだけそれを含めないでください。クラスAのヘッダーにクラスを宣言するだけです。
class B;
2番目の方が優れています。 B
クラスは、.h
ファイルを使用してインクルードするモジュールになります。将来、B
をサブクラス化し、A
を更新してC
を使用する場合を考えてみましょう。 2番目のケースでは、ヘッダ#include
とA
のメイクだけを交換します。最初のケースでは、前方宣言を変更する必要があります。また、2番目のケースでは、シンボルB
以上を定義します。
コメントのように、ヘッダファイルが残りのコードと同じディレクトリにある場合は、#include "B.h"
を使用する必要があります。
、あなたはクラスBも場合にはクラスA
を使用して、クラスBを使用してクラスAのようなものを持っていた場合にはあるのでしょう理由あなたの2番目の選択肢を確実に使用できる関係は1つだけです。 二重使用が必要な場合は、クラスの少なくとも1つが減速を使用する必要があります。
回答:
は(デビッドKieras、EECS部門、ミシガン大学による)http://www.umich.edu/~eecs381/handouts/handouts.html
C Header File Guidelines
C++ Header File Guidelinesを見てみましょうと言う:#10
ガイドライン。 X型の宣言が不完全な場合は、ヘッダX.hを#includeする代わりに を使用します。別の構造体またはクラス タイプXが、 ヘッダーファイルの内容のポインタまたは参照タイプとしてのみ表示される場合は、Xhを#includeするのではなく、 Xの不完全宣言(「前方宣言) の近くのヘッダーファイルの先頭には、
class X;
が含まれています。 貴重なテクニックの詳細については、 Incomplete Declarationsを参照してください。標準ライブラリには、しばしば<iostream>
ライブラリ(<iosfwd>
)が必要な不完全な宣言のヘッダ が含まれています。できるだけ#<iosfwd>
をインクルードしてください。<iostream>
ヘッダーファイルが非常に大きい(巨大なテンプレート!)ためです。
最初の方法は前方宣言です。2番目のクラスには実際にクラスBが含まれています。
次のようにしてください: '#include" B.h "' –
ああ、私は注意します... – colddie