web-dev-qa-db-ja.com

C ++プログラムに含まれるヘッダーの相互参照

次の例のように設定されたシナリオに興味があります。

これは、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

これを行うと(私が想定しているインクルードのために)エラーメッセージが表示されますが、各オブジェクトを別々のクラスに含めるためにこれを行う必要があるように感じます。誰かが私がこれを達成するのを手伝ってくれる?私は何が間違っているのか?

22
banDedo

問題は、Class1のサイズがClass2に依存し、その逆も同様であるということです。したがって、どちらのサイズも計算する方法はありません。クラスの1つを前方宣言し、属性の1つをポインターまたは参照に変更します。

#ifndef HEADER2_H
#define HEADER2_H

class Class1;
class Class2
{
 Class1 *class1Instance;
 // or
 Class1 &class1Instance;
};

#endif
33
John Millikin

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

ここ から適応

9
sadhen

2つの構造体は互いに無限に再帰します。Class1のサイズを知るには、Class2のサイズを知る必要があります。これにはClass1のサイズなどが必要です。これを回避するには次のようにします。少なくとも1つの場合のポインタ:

#ifndef HEADER1_H
#define HEADER1_H

class Class2; // no need to include Header2

class Class1
{
    Class2* class2Instance;
}

#endif
3
fbrereto

Class2にClass1のインスタンスを含めたり、Class1にClass2のインスタンスを含めたりすることはできません。あなたができることは、各クラスに他のクラスタイプのインスタンスへの参照またはポインタを含めることです(適切な前方参照を使用)。つまり.


class Class2;
class Class1
{
    Class2& class2Instance;
};

class Class1;

class Class2
{
    Class1& class1Instance;
};
2
Ferruccio

あなたが持っているのは古典的な循環参照です。それは すでに議論されています ここStackOverflowで。 「class」を「struct」に置き換えて、そのスレッドに受け入れられた回答を適用するだけで、あなたは黄金になります。

わかりやすくするために編集

1
Randolpho