C 中嵌套类型/类的前向声明
在 C 中,嵌套类型和类是组织代码和封装数据的有用功能。然而,前向声明嵌套类型提出了独特的挑战。
考虑以下场景:
class A { public: typedef struct/class { ... } B; ... C::D *someField; }; class C { public: typedef struct/class { ... } D; ... A::B *someField; };
通常,您可以使用以下语法前向声明类名:
class A;
但是,这种方法对于嵌套类型失败。以下语句将导致编译错误:
class C::D;
为什么不能转发嵌套类型
无法转发声明嵌套类型是一个限制C语言语法。它与编译器解析和解析类声明和引用的方式有关。
当遇到前向声明时,编译器会在内存中为类对象保留一个占位符。然而,对于嵌套类型,编译器不知道在哪里放置这个占位符,因为外部类的定义尚未解析。
解决方法
不幸的是,有没有直接解决这个问题的方法。要解决此问题,您必须至少取消嵌套一个嵌套类。例如,您可以将代码重组为以下形式:
typedef struct/class Outer { ... Nested *someField; }; class Nested { ... }; class A { public: typedef Outer B; ... }; class C { public: typedef Outer D; ... };
通过将 Outer 设为单独的类型,您现在可以转发声明 A::B 和 C::D。这使得编译成功并提供所需的功能。
以上是为什么我不能在 C 中转发声明嵌套类?的详细内容。更多信息请关注PHP中文网其他相关文章!