前向声明指定大小的类
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 一样,实际上并不关心类型,只是为符号填写正确的地址(当然,我正在简化一点)。
如果我们可以在一个文件中指定类的大小,然后在另一个文件中添加成员时忘记更新它,那么不检查一致性确实是非常危险的。"一个定义规则"的方式基本上是说,如果一个类在一个程序中有多个不相同的定义,任何事情都可能发生。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别