あなたは、ヘッダ上のクラスではなく、完全なオブジェクトへのポインタが必要な場合は、単に前方宣言を追加し、含まいけませんポインタのクラスのヘッダ。
私はあなたが他のクラスへの参照を持っているそのクラスにアクセスするためのポインタを使用していると思いますか?あなたが知っているのは、インスタンスを使用する場合、インスタンスがループしているからです。前方宣言を使用する。その型をポインタ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>
とより良いによって定義された標準になります。
これはポインタだけでなく、メソッドのパラメータと戻り値の型にも当てはまります。 – Geoffroy
はい、私は知っていますが、私はそれがポインタのためだけだと言っていない、私はあなたが完全なオブジェクトを必要としないなら、それは実装だと言いました。そして、ああ、申し訳ありませんが、なぜ私の答えと@boydcの1つを役に立たないとマークしましたか?これは真実ではありません。 –
実装ではなく宣言です。また、通常はその型のインスタンス変数を宣言するときに、オブジェクトのサイズを知る必要がある場合にも使用します。 – Geoffroy