为什么在使用类型作为字段时不能推迟不完整类型(前向声明)的大小计算?
Why incomplete type (forward declared) size calculation cannot be postponed when using type as a field?
在下面的代码中:
class B;
struct A
{
B* b; // <- why MUST be a pointer? Why size cannot be calculated later...?
}
struct B
{
...
}
据我了解,struct A 必须将 b 定义为 B*,因为编译器在计算 A 的大小时无法判断 B 的大小。
我不明白的是,为什么编译器不能推迟计算直到找到 B 的完整定义(正如程序员通过转发声明 class 承诺的那样)
假设您可以实际将A
定义为:
class B;
struct A {
B b; // not a pointer
}
也就是说,b
是不完整类型的数据成员——此时编译器不知道B
的大小。
那么,如果B
被定义为:
struct B {
A a;
}
这需要无限的内存。
原因很简单,C++ 被设计为通过源代码一次编译(或多或少);目标是编译器不必推迟编译某些东西,因为在定义它的地方没有足够的信息。
在下面的代码中:
class B;
struct A
{
B* b; // <- why MUST be a pointer? Why size cannot be calculated later...?
}
struct B
{
...
}
据我了解,struct A 必须将 b 定义为 B*,因为编译器在计算 A 的大小时无法判断 B 的大小。
我不明白的是,为什么编译器不能推迟计算直到找到 B 的完整定义(正如程序员通过转发声明 class 承诺的那样)
假设您可以实际将A
定义为:
class B;
struct A {
B b; // not a pointer
}
也就是说,b
是不完整类型的数据成员——此时编译器不知道B
的大小。
那么,如果B
被定义为:
struct B {
A a;
}
这需要无限的内存。
原因很简单,C++ 被设计为通过源代码一次编译(或多或少);目标是编译器不必推迟编译某些东西,因为在定义它的地方没有足够的信息。