如何解决将类型用作字段时,为什么不能推迟不完整的类型预先声明大小计算?
在以下代码中:
class B;
struct A
{
B* b; // <- why MUST be a pointer? Why size cannot be calculated later...?
}
struct B
{
...
}
据我了解,结构A必须将b定义为B *,因为编译器在计算A的大小时无法告诉B的大小。
我不明白的原因是为什么编译器在找到B的完整定义之前不能推迟计算(正如程序员通过转发声明该类所承诺的那样)
解决方法
假设您可以将A
实际定义为:
class B;
struct A {
B b; // not a pointer
}
也就是说,b
是不完整类型的数据成员 –编译器目前不知道B
的大小。
然后,如果B
被定义为:
struct B {
A a;
}
这将需要无限的内存。
,从本质上讲,指针是内存中的地址。要拥有这样的地址,您无需知道其指向的对象的大小。
但是使用不完整类型的指针并不能做很多事情。例如:
-
您无法使用新表达式创建新对象(构造函数是什么?)
-
您不能使用指针算术(对象的大小是多少?)
-
等,请参阅here。
具有指向不完整类型的指针的可能性实际上相当有用,例如,它允许PImpl idiom。
,原因很简单,C ++旨在通过一次遍历源代码(或多或少)进行编译;目的是使编译器不必推迟编译,因为在定义时没有足够的信息。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。