C++ Class Prototyping

C++ Class Prototyping

本文关键字:Prototyping Class C++      更新时间:2023-10-16

我错过了什么吗?

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;
};

允许前向声明类的指针和引用的原因是,指针和引用的大小不依赖于它们所指向(或引用)的类的结构。

是的,你错过了一些重要的东西:一个问题。

我假设你想知道代码中哪里出了问题,以及为什么编译器会发出错误。

编译器必须知道Foo的大小才能计算类Bar的布局。Foo对象的大小由它们的布局决定,要知道布局,编译器必须知道类的定义。在声明成员变量foo时,它只知道foo存在,而不知道它的大小,因为您之前只给了它一个声明,而不是定义。