1

こんにちは私は2つのクラスAとBを持っています。AではBのヘッダーファイルを使用しているので、Bのインスタンスを作成できます(例:B * b)。クラスBで行っていることも、AのヘッダーファイルをインクルードしてAのインスタンスを作成します(例: A * a)inB。

AのヘッダーファイルをBにインクルードしている間、Ahで次のエラーが発生します

1>c:\Bibek\A.h(150) : error C2143: syntax error : missing ';' before '*'
1>c:\Bibek\A.h(150)(150) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>c:\Bibek\A.h(150)(150) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
4

1 に答える 1

4

ヘッダーファイルを循環的にインクルードしているようです(AhにはBhが含まれ、Ahが含まれます)。ヘッダーガードを使用するということは、上記のシナリオでBhにAhが含まれている場合、それをスキップすることを意味します(現在アクティブなAhのインクルードガードのため)。したがって、Bhの解析時にAhのタイプはまだ定義されていません。

修正するには、前方宣言を使用できます。

// A.h
#ifndef A_H
#define A_H

// no #include "B.h"

class B; // forward declaration of B
class A {
  B* b;
};

#endif

Bhについても同様です

これにより、前方宣言されたクラスのポインターを使用できます(たとえば、メンバー変数の宣言、メンバー関数の宣言)が、ヘッダーで他の方法で使用することはできません。

次に、A.cppで、Bhを適切に定義する必要があるため、次のように含めます。

// A.cpp

#include "A.h"
#include "B.h" // get the proper definition of B

// external definitions of A's member functions

この構造により、ヘッダーファイルの循環インクルードが回避され、タイプ(.cppファイル内)を完全に使用できるようになります。

注:デフォルトのintの非サポートに関するエラーは、コンパイラーがABhを含める場合の適切な定義を持っていないために発生します(C言語intでは不明な型のデフォルト定義が許可されていますが、C ++では許可されていません)

于 2012-04-15T04:21:44.023 に答える