0

Aというクラスがあり、そのクラス.cpp.hppファイルがあります。Bクラスとに依存しますC。今、私は疑問に思っています、私#include B.hpp#include C.hppインまたはインA.cppまたはA.hpp?'sのベクトルを作成しているので#include、ファイルに含めると有益だと思います。前方宣言するだけでコンパイラが正しいサイズを認識できるかどうかはわかりません(したがって、 tポインタが正しくインクリメントされます)...「前方宣言」とは、書き込みとの始まりを意味します。A.hppB*Bclass B;class C;A.hpp

4

3 に答える 3

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」はすでに定義されているなどのエラーは表示されません。

于 2012-09-21T13:29:14.680 に答える
1

のベクトルの場合、他のヘッダーB*に含める必要はありません。B.hpp前方宣言は問題ありません。ポインターは、何を指すかに関係なく、同じサイズを持ちます。

必要な場合にのみインクルードすることをお勧めしますが、これは確かにそうではないようです。

于 2012-09-21T10:54:59.830 に答える
1

あなたのクラス階層を理解しているかどうかわかりませんが、私の考えでは次のようになります。

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.hppandを含める限り、コンパイラはそのサイズを推測できます (クラス サイズ、ポインター サイズは常に同じです)。なんで?ファイル内で、. 私が言おうとしていることを理解するのに役立つこの回答を見つけました。C.hppA.cppcpp#include

hpp代わりにファイルで問題ありませんか?たぶん、あなたA.hppが他のファイルに含まれていないなら、わざわざ別のファイルに拡散することはclass Bありません。class Cしたがって、その場合は必要ありません。しかし、私見のベストプラクティスは、可能な場合は宣言を転送し#includecppファイルに入れることです。

于 2012-09-21T11:09:06.367 に答える