Aというクラスがあり、そのクラス.cpp
と.hpp
ファイルがあります。B
クラスとに依存しますC
。今、私は疑問に思っています、私#include B.hpp
と#include C.hpp
インまたはインA.cpp
またはA.hpp
?'sのベクトルを作成しているので#include
、ファイルに含めると有益だと思います。前方宣言するだけでコンパイラが正しいサイズを認識できるかどうかはわかりません(したがって、 tポインタが正しくインクリメントされます)...「前方宣言」とは、書き込みとの始まりを意味します。A.hpp
B*
B
class B;
class C;
A.hpp
3 に答える
すでに述べたように、前方宣言を使用することで詰め込む必要があることを回避できることがよくあります。#include
実際、ベスト プラクティスは、含まれる他のヘッダーの量を最小限に抑えることです。
しかし: 質問の見出しに答えるには: はい、そうすることができます。「循環的な包含」を回避するための一般的なメカニズムは次のとおりです。
A.hpp:
#ifndef A_HPP_INCLUDED
#define A_HPP_INCLUDED
... // code
#endif
ここで、B.hpp に A.hpp が含まれているとすると、C.hpp は次のようになります。
#ifndef C_HPP_INCLUDED
#define C_HPP_INCLUDED
#include "A.hpp"
#include "B.hpp"
...
#endif
そうすれば、「クラス A」はすでに定義されているなどのエラーは表示されません。
のベクトルの場合、他のヘッダーB*
に含める必要はありません。B.hpp
前方宣言は問題ありません。ポインターは、何を指すかに関係なく、同じサイズを持ちます。
必要な場合にのみインクルードすることをお勧めしますが、これは確かにそうではないようです。
あなたのクラス階層を理解しているかどうかわかりませんが、私の考えでは次のようになります。
B.hpp
class B
{
B();
};
B.cpp
B::B() {};
C.hpp
class C
{
C();
};
A.cpp
A::A() {};
A.hpp
class A
{
A();
B *b;
C *C;
};
A.cpp
#include "B.hpp"
#include "C.hpp"
A::A() :
b(NULL), c(NULL)
{
};
これは正しいです?(そうでない場合は、いくつかのコードを提供することを考えてください;)class A
ポインタがclass B
ありclass C
、前方宣言だけが必要な場合。
前方宣言のみを行った場合、コンパイラが B の正しいサイズを認識するかどうかはわかりません
はい、ファイルにB.hpp
andを含める限り、コンパイラはそのサイズを推測できます (クラス サイズ、ポインター サイズは常に同じです)。なんで?ファイル内で、. 私が言おうとしていることを理解するのに役立つこの回答を見つけました。C.hpp
A.cpp
cpp
#include
hpp
代わりにファイルで問題ありませんか?たぶん、あなたA.hpp
が他のファイルに含まれていないなら、わざわざ別のファイルに拡散することはclass B
ありません。class C
したがって、その場合は必要ありません。しかし、私見のベストプラクティスは、可能な場合は宣言を転送し#include
てcpp
ファイルに入れることです。