次の例のように設定されたシナリオに興味があります。
これは、Header1.hというファイルに配置されるコードです。
#ifndef HEADER1_H
#define HEADER1_H
#include "Header2.h"
class Class1
{
Class2 class2Instance;
};
#endif
これは、Header2.hというファイルに配置されるコードです。
#ifndef HEADER2_H
#define HEADER2_H
#include "Header1.h"
class Class2
{
Class1 class1Instance;
};
#endif
これを行うと(私が想定しているインクルードのために)エラーメッセージが表示されますが、各オブジェクトを別々のクラスに含めるためにこれを行う必要があるように感じます。誰かが私がこれを達成するのを手伝ってくれる?私は何が間違っているのか?
問題は、Class1のサイズがClass2に依存し、その逆も同様であるということです。したがって、どちらのサイズも計算する方法はありません。クラスの1つを前方宣言し、属性の1つをポインターまたは参照に変更します。
#ifndef HEADER2_H
#define HEADER2_H
class Class1;
class Class2
{
Class1 *class1Instance;
// or
Class1 &class1Instance;
};
#endif
file:header1.h
#ifndef HEADER1_H
#define HEADER1_H
class Class2; // no need to include Header2
class Class1
{
Class2* class2Instance;
}
#endif
file:header1.cpp
#include "header2.h" // do include Header2 here, otherwise you will get errors
ここ から適応
2つの構造体は互いに無限に再帰します。Class1
のサイズを知るには、Class2
のサイズを知る必要があります。これにはClass1
のサイズなどが必要です。これを回避するには次のようにします。少なくとも1つの場合のポインタ:
#ifndef HEADER1_H
#define HEADER1_H
class Class2; // no need to include Header2
class Class1
{
Class2* class2Instance;
}
#endif
Class2にClass1のインスタンスを含めたり、Class1にClass2のインスタンスを含めたりすることはできません。あなたができることは、各クラスに他のクラスタイプのインスタンスへの参照またはポインタを含めることです(適切な前方参照を使用)。つまり.
class Class2;
class Class1
{
Class2& class2Instance;
};
class Class1;
class Class2
{
Class1& class1Instance;
};
あなたが持っているのは古典的な循環参照です。それは すでに議論されています ここStackOverflowで。 「class」を「struct」に置き換えて、そのスレッドに受け入れられた回答を適用するだけで、あなたは黄金になります。
わかりやすくするために編集