我在这里错过了什么吗?
class Foo;
class Bar {
public:
Foo foo;
};
class Foo { };
错误:
错误C2079:'Bar :: foo'使用未定义的类'Foo'
答案 0 :(得分:8)
当你向前声明一个类时,你可以创建一个指针和引用它,但你不能创建前向声明类的成员:需要Foo
的完整定义来决定它的布局外部类(即Bar
),否则编译器无法对Bar
的大小和结构做出决定。
但这是允许的:
class Foo;
class Bar {
public:
Foo* fooPtr;
Foo& fooRef;
};
允许指向前向声明的类的指针和引用的原因是指针和引用的大小不依赖于它们指向的类的结构(或它们引用的类)。
答案 1 :(得分:0)
是的,你遗漏了一些重要的东西:一个问题。
我假设你想知道代码中的错误,以及编译器发出错误的原因。
编译器必须知道Foo的大小才能计算类Bar的布局。 Foo对象的大小由它们的布局决定,要知道布局,编译器必须知道类的定义。在你声明成员变量foo时,它只知道Foo存在,但不知道它的大小,因为你只给它一个声明,而不是之前的定义。