2011-12-26 18 views
2

ここに問題があります。クラスAとクラスBの2つのクラスを持つヘッダファイルを記述する必要があります。ヘッダーファイルのクラス宣言についてC++

は、クラスBのオブジェクトを使用する関数を持ち、クラスBはクラスAのオブジェクトを使用する関数を持ちます。

Aが最初に宣言された場合、クラスBが宣言されていないというエラーが発生します。 どうすれば対処できますか?

void classA::myfunc (classB *b); 

しかし、私は、関数myfunc関数が宣言されていないというエラーが発生しました:私は、クラスBの宣言の後にクラスAの関数を宣言してみてください。 C++の経験豊かな人たち、何をすればいいですか?

を追加しました:ここ が良いのリンクですabout header

答えて

8

あなたは、ヘッダ上のクラスではなく、完全なオブジェクトへのポインタが必要な場合は、単に前方宣言を追加し、含まいけませんポインタのクラスのヘッダ。

私はあなたが他のクラスへの参照を持っているそのクラスにアクセスするためのポインタを使用していると思いますか?あなたが知っているのは、インスタンスを使用する場合、インスタンスがループしているからです。前方宣言を使用する。その型をポインタ1に言及しているクラスを持つことができる方法を説明するために

ああ

class B; 
class C; 
class D; 
class E; 

class A { 
    B* pointer; //To just have a pointer to another object. 
    void doThings(C* object); //if you just want to tell that a pointer of a object is a param 
    D* getThings(); //if you wanna tell that a pointer of such class is a return. 
    E invalid(); //This will cause an error, because you cant use forward declarations for full objects, only pointers. For this, you have to use #include "E.h". 
}; 

:ここ

は、あなたが宣言を前方に使用する方法の例です

Bhの

class A; 
class B { 
    A* pointer; //That can be done! But if you use a includes instead of the forward declarations, you'll have a include looping, since A includes B, and B includes A. 
} 

Tony Delroy(彼に多くのおかげで)が述べたように、常にこのデザインを使用してください。これはC++コンパイラによって提供されていますが、良い方法ではありません。

B.fwd.h:

class B; 

ああ、このような

#include "B.fwd.h" 
#include "C.fwd.h" 
#include "D.fwd.h" 
#include "E.fwd.h" 

class A { 
    B* pointer; //To just have a pointer to another object. 
    void doThings(C* object); //if you just want to tell that a pointer of a object is a param 
    D* getThings(); //if you wanna tell that a pointer of such class is a return. 
    E invalid(); //This will cause an error, because you cant use forward declarations for full objects, only pointers. For this, you have to use #include "E.h". 
}; 

とあなた前方ヘッダー:あなたのコードは次のようになりますので、最高のは、リファレンスヘッダを提供することです

あなたのfwdsでは、あなたはクラスの前方宣言とそれに付属するtypedefを持つべきです。

私は#pragma onceを言及していないよ、または#ifndef B.H...あなたは彼らがそこにいる知っている:D

あなたのコードでは、彼らはテンプレートがある場合は、特別に、維持するために<iosfwd>とより良いによって定義された標準になります。

+0

これはポインタだけでなく、メソッドのパラメータと戻り値の型にも当てはまります。 – Geoffroy

+0

はい、私は知っていますが、私はそれがポインタのためだけだと言っていない、私はあなたが完全なオブジェクトを必要としないなら、それは実装だと言いました。そして、ああ、申し訳ありませんが、なぜ私の答えと@boydcの1つを役に立たないとマークしましたか?これは真実ではありません。 –

+0

実装ではなく宣言です。また、通常はその型のインスタンス変数を宣言するときに、オブジェクトのサイズを知る必要がある場合にも使用します。 – Geoffroy

3

短い答え:

class classA; 

は、次に、あなたのClassBのを定義し、その後、クラスAの宣言。

これは前方宣言と呼ばれ、あなたの問題を解決するために存在している:)

+1

通常、共通のヘッダーに必要に応じて共通クラスを宣言します。プリコンパイルされたヘッダーまたは共通ライブラリヘッダー(列挙型やクラスなど)は、このためにうまく機能します。 – ssube

0
you can do like this: 

try to add a uncomplete decleration of a class before you use it with a ref or ptr 

classA.h: 


class classB; 

class classA { 
     void fun(classB * b); 
} 


classB.h: 

class classA; 

class classB { 
     void fun(classA * a); 
} 


classA.cpp: 

#include "classA.h" 
#include "classB.h" 

... 

classB.cpp: 

#include "classA.h" 
#include "classB.h" 

... 
+0

あなたのしていることを説明してください。 – Geoffroy

+0

説明..... – boydc

+0

本当にいいえ:)そしてあなたの答えを正しくフォーマットしようとしてください:) – Geoffroy

関連する問題