ここで何か不足していますか?
class Foo;
class Bar {
public:
Foo foo;
};
class Foo { };
エラー:
エラー C2079: 'Bar::foo' は未定義のクラス 'Foo' を使用しています
ここで何か不足していますか?
class Foo;
class Bar {
public:
Foo foo;
};
class Foo { };
エラー:
エラー C2079: 'Bar::foo' は未定義のクラス 'Foo' を使用しています
クラスを前方宣言する場合、そのクラスへのポインターと参照を作成できますが、前方宣言されたクラスのタイプのメンバーを作成することはできません。Foo
外部クラス(つまりBar
)のレイアウトを決定するには、の完全な定義が必要です。コンパイラは、のサイズと構造を決定できませんBar
。
ただし、これは許可されています。
class Foo;
class Bar {
public:
Foo* fooPtr;
Foo& fooRef;
};
前方宣言されたクラスへのポインターと参照が許可される理由は、ポインターと参照のサイズが、それらが指す(またはそれらが参照する)クラスの構造に依存しないためです。
はい、重要な何かが欠けています: 質問です。
コードのどこが間違っているのか、コンパイラがエラーを出す理由を知りたいと思っていると思います。
コンパイラは、Bar クラスのレイアウトを計算するために、Foo のサイズを知る必要があります。Foo オブジェクトのサイズはレイアウトによって決まります。そのレイアウトを知るには、コンパイラはクラス定義を知る必要があります。Member 変数 foo を宣言する時点では、Foo が存在することだけを知っていますが、そのサイズは知りません。これは、前に定義ではなく宣言だけを与えているためです。