1

私は C++ プログラミングが初めてなので、私の質問がばかげていると思うかもしれません。申し訳ありませんが、この Java スタイルの構造を実装する方法を知りたいです。

#include "B";
class A {
   B objB;
}
---
#include "A";
class B {
   A objA;
}

コンパイラは、このコードを理解しようとして夢中になっています。可能な解決策について教えてください。ありがとう!

4

4 に答える 4

5

このコードは C++ では違法であり、コンパイラがそれを拒否するのは正しいことです。問題は、タイプ B のオブジェクトの内部にタイプ A の具体的なオブジェクトがある場合、またはその逆の場合、どちらのオブジェクトのサイズについても意味のある定義がないことです。特に、C++ のオブジェクトは、それぞれ少なくとも 1 バイトのサイズでなければなりません。したがって、タイプ A ( と呼びます) のオブジェクトが与えられた場合、、 、 などaのために 1 バイトのストレージが必要です。実際には、これらのオブジェクトの内側にさらにネストされたオブジェクトが常に存在するため、無限のストレージ スペースが必要になります。aa.objB.objAa.objB.objA.objB.objA

これを修正するには、タイプ B および A のオブジェクトへのポインターをそれぞれ A および B に格納するように、これを変更する必要があります。ポインターはオブジェクトを指しA*ますが、ポインター自体はオブジェクトではないため、4 バイトしか使用しないため、チェーンが壊れます。これを取得したら、前方宣言を使用してこれらのポインターを宣言できます。例えば:AA

ファイル: ああ:

class B;
class A {
     B* objB;
};

ファイル: Bh:

class A;
class B {
     A* objA;
};

お役に立てれば!

于 2011-02-04T05:46:18.047 に答える
2

前方宣言する必要があります

class B;

クラス A を定義する前に、前と同じように続行します。これは参照には機能しますが、このようなオブジェクトには機能しません。オブジェクトに暗黙的にそれ自体を含めることは実際にはできないためです。

于 2011-02-04T05:47:09.567 に答える
1

Bオブジェクト内にあるオブジェクト内でオブジェクトAをインスタンス化することはできませんB。オブジェクトには無限再帰があるため、再帰的にオブジェクトを構築することはできません。

できること:

#include "B"
class A {
    B *objB;
}

#include "A"
class B {
    A objA
}
于 2011-02-04T05:44:37.877 に答える
0

これを確認する別の方法は、AHまたはBHを「最初に」インクルードした単一のソースファイルを検討することです。[そこでも混乱が生じる可能性があるため、「最初の」引用が引用されています。]

class A {
   B objB;
}
class B {
   A objA;
}

これはどのように意味がありますか?Bを知る前にAを定義することはできません。また、Aを知る前にBを定義することもできません。したがって、他の人が指摘しているように、間接参照によるソリューションです。

于 2011-02-04T05:52:46.763 に答える