递归阻碍类定义
最近的编程查询解决了在类中声明反映类自身类型的私有成员的问题。具体来说,以下代码会引发“不完整类型”错误:
class A { private: A member; }
但是,使用指针而不是直接成员声明(“A* member;”)可以解决该问题。为什么会这样?
答案就在类定义过程中。当在类定义中声明成员时,类本身仍然被定义。这使得“A”类型未定义,使其成为“不完整类型”。相反,当使用指针时,编译器甚至在定义完成之前就可以将“A”识别为类名,从而允许它定义“指向 A 的指针”类型。
这个概念超出了类的范围。将类型声明为“Foo;”有效地表示类声明,但没有其完整定义。然而,“Foo* foo;”可以被定义,因为它代表一个指向“Foo”类型的指针,编译器在该阶段确认该类型。
当使用引用自身的递归类型定义时,同样的原理也适用。然而,仅使用指针来实现这一点提供了更直接的方法。考虑以下替代方案:
class A { private: boost::shared_ptr<A> member; };
通过使用智能指针(例如 boost::shared_ptr),消除了手动内存管理的需要。
以上是为什么使用类指针可以避免递归类定义中的'不完整类型”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!