1

ここで何か不足していますか?

class Foo;

class Bar {
    public:
        Foo foo;
};

class Foo { };

エラー:

エラー C2079: 'Bar::foo' は未定義のクラス 'Foo' を使用しています

4

2 に答える 2

8

クラスを前方宣言する場合、そのクラスへのポインターと参照を作成できますが、前方宣言されたクラスのタイプのメンバーを作成することはできません。Foo外部クラス(つまりBar)のレイアウトを決定するには、の完全な定義が必要です。コンパイラは、のサイズと構造を決定できませんBar

ただし、これは許可されています。

class Foo;

class Bar {
    public:
        Foo* fooPtr;
        Foo& fooRef;
};

前方宣言されたクラスへのポインターと参照が許可される理由は、ポインターと参照のサイズが、それらが指す(またはそれらが参照する)クラスの構造に依存しないためです。

于 2013-02-28T08:19:02.930 に答える
0

はい、重要な何かが欠けています: 質問です。

コードのどこが間違っているのか、コンパイラがエラーを出す理由を知りたいと思っていると思います。

コンパイラは、Bar クラスのレイアウトを計算するために、Foo のサイズを知る必要があります。Foo オブジェクトのサイズはレイアウトによって決まります。そのレイアウトを知るには、コンパイラはクラス定義を知る必要があります。Member 変数 foo を宣言する時点では、Foo が存在することだけを知っていますが、そのサイズは知りません。これは、前に定義ではなく宣言だけを与えているためです。

于 2013-02-28T08:19:38.343 に答える