前向声明 class 指定大小

Forward declare class specifying size

是否可以转发声明 class,并实际指定其大小,以便在同一个标​​头中我可以在 class 定义中使用 class?

例如:

class Foo = 3 * sizeof(int);

class Bar
{
    Foo foo;
};

而不是必须 #include "Foo.h",那会是这样的:

class Foo
{
    int a, b, c;
};

仅供参考:不用担心,我永远不想(希望)做这样的事情,我只是好奇。 请注意,对于前向声明枚举 classes,上述是可能的,这听起来有点相似。

不,这是不可能的。

为什么不呢?

请注意,编译器需要完整的类型来实例化一个对象,不仅是为了知道大小,而且还知道必须使用哪些构造函数和析构函数,在您的示例中,只有当构造函数或析构函数必须为 Bar 生成。 Foo 在给定平台上也可能存在对齐限制。

在您的情况下,编译器可能必须为 Bar 生成默认构造函数和析构函数。如果 Foo 碰巧有一个非平凡的构造函数 and/or 析构函数,默认或明确指定,则必须在那些 constructors/destructors.

中调用

评论已经提到,对于枚举 classes,完整类型实际上已由前向声明充分指定:枚举不能有构造函数或析构函数,其大小和对齐限制也可从基础整数类型。

我假设做出不允许这样做的决定是因为如果 class 定义可以散布在不同的文件中,确保一致性会使构建过程更加复杂并且与 C 不同。请注意,C++ 可以是与 "dumb" 链接器链接,就像 C 一样,实际上并不关心类型,只是为符号填写正确的地址(当然我正在简化一点)。

如果我们可以在一个文件中指定 class 的大小,然后在另一个文件中添加成员时忘记更新它,那么不检查一致性确实是非常危险的。 "one-definition-rule" 的意思基本上是说,如果 class 在一个程序中有多个不同的定义,那么任何事情都可能发生。