前向声明指定大小的类

Forward declare class specifying size

本文关键字:声明      更新时间:2023-10-16

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

例如:

class Foo = 3 * sizeof(int);
class Bar
{
Foo foo;
};

而不必 #include"Foo.h",这将是这样的:

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

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

不,这是不可能的。

为什么不呢?

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

在您的情况下,编译器可能必须为 Bar 生成默认构造函数和析构函数。如果Foo碰巧有一个非平凡的构造函数和/或析构函数,默认或显式指定,则必须在这些构造函数/析构函数中调用。

注释已经提到,对于枚举类,完整类型实际上已由前向声明充分指定:枚举不能具有构造函数或析构函数,其大小和对齐限制也从底层整数类型中已知。

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

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