前向声明 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 在一个程序中有多个不同的定义,那么任何事情都可能发生。
是否可以转发声明 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 在一个程序中有多个不同的定义,那么任何事情都可能发生。