2012-04-15 8 views
1

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

私はBでAのヘッダファイルを含めていながら、それは私に次のエラーを与えるああ

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 
+3

私たちは十分な情報がありません。 'A.h'には何が入っていますか?特に150行目とその周辺にありますか? – geekosaur

+0

ここでいくつかのコードを使用することは間違いありません。 –

答えて

4

あなたは、円形の方法でヘッダファイルを含めているようですね(あが含まBhのを、含みああ)。ヘッダーガードを使用すると、上記のシナリオでB.hにA.hが含まれている場合、A.hの現在アクティブなインクルードガードのためにスキップされるので、A.hの型はB.hを解析するときにまだ定義されていません。これは、あなたが(メンバ変数、メンバ関数の宣言の宣言で例えば)クラス宣言前方のポインタを使用することができますBhの

についても同様に

// A.h 
#ifndef A_H 
#define A_H 

// no #include "B.h" 

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

#endif 

:修正するには

、あなたは宣言を前方に使用することができますヘッダー内で他の方法で使用することはできません。

はその後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ファイル)。

注:Bhを含めると、コンパイラがAの適切な定義を持たないため、デフォルトintがサポートされないというエラーが発生します(C言語では不明な型のデフォルトintの定義が可能ですが、 C++)

+0

ここに示した1つのベストプラクティスは、モジュールのソースファイル(この場合は 'A.cpp')の* first *' #include'ファイルはそれ自身のヘッダファイル( 'A.h')でなければなりません。これは、ヘッダーが必要なヘッダーで引っ張られない問題を捕捉するのに役立ちます。他の誰かがあなたのヘッダーを使用しようとしてから、多くの未定義のエラーが出るまでは潜む可能性があります。 –

+0

私は上記の方法でクラスAのクラスBのオブジェクトを作成できますか?B * b = new B(); – Kenta

+0

はい、そうすることができます – Attila

関連する問題