0

複数のヘッダーファイルがあるという問題があり、それぞれを相互にインクルードする必要があります。明らかに、これは実行できません。コンパイルすると、「インクルードが深くネストされすぎています」というエラーがスローされます。これは、基本的にコンパイラーに無限のインクルードループに入るように要求するためです。

voidポインターを使用して修正することはできますが、これは私には悪いコーディング慣行のようです。

理解を助けるために、私がやろうとしていることの例を次に示します。

ファイル-A:

#include "File-B"
#include "File-C"
class A
{
    public: B* p_B;
    public: C* p_C;
};

ファイル-B:

#include "File-A"
#include "File-C"
class B
{
    public: A* p_A;
    public: C* p_C;
};

ファイル-C:

#include "File-B"
class C
{
    public: B* p_B;
};

これは、各クラス宣言が必要な場所を示しているだけです。確かに、より良い解決策がありvoid*ます。

編集:私はすでにインクルードガードを使用しています。このコードは、私がやろうとしていることを確認するのに役立つだけです。

4

4 に答える 4

3

インクルード ガードを使用する必要があります。

#ifndef _FILE_A_H_
#define _FILE_A_H_

// Contents of FileA.h...

#endif

場合によっては、前方宣言を使用して、データ構造の定義間の循環依存を解消することもできます。

FileA.h

class B; // No need to #include "FileB.h"

class A
{
public:
    B* pB;
};

FileB.h

class A; // No need to #include "FileA.h"

class B
{
public:
    A* pA;
};
于 2013-02-24T18:13:06.760 に答える
1

他のクラスへのポインターまたは参照を使用していて、ヘッダーファイルにコードがない場合は、前方宣言を使用できます。

class A; // Forward declaration

class C; // Forward declaration

class B
{
  public:
    A* p_A;
    C* p_C;
};

ヘッダーファイルのコードが他のクラスのメンバーを参照している場合は、他のクラスの定義全体をインクルードする必要があります。

于 2013-02-24T19:50:41.050 に答える
1

特定のファイルを 1 回だけインクルードするインクルード ガードを使用します。

#ifndef FILE_A
#define FILE_A
class A
{
    public: B* p_B;
    public: C* p_C;
};
#endif

http://en.wikipedia.org/wiki/Include_guard

ファイルごとに 1 回だけヘッダー ファイルが含まれます。標準ではありませんが、#pragma_once を使用することもできます。

それが機能しない場合は、前方宣言を使用できます。

class B;
class C;
class A
{
    public: B* p_B;
    public: C* p_C;
};
于 2013-02-24T18:12:57.203 に答える
0

これがあなたが#include <>警備員を持っている理由です。

#ifndef _FILE_B
#define _FILE_B
#include "File-A"
#include "File-C"
class B
{
    public: A* p_A;
    public: C* p_C;
};
#endif
于 2013-02-24T18:13:16.377 に答える