【问题标题】:Why other class names are specified above a class? [duplicate]为什么在一个类上方指定其他类名? [复制]
【发布时间】:2011-09-27 09:03:06
【问题描述】:

可能重复:
When to use forward declaration?

在特定类之上指定其他类名有什么用?

class A;
class B;

class C
{
 ...
 ...
};

【问题讨论】:

  • 检查我标记为重复的Q,它解释了使用前向声明时可以做什么和不能做什么。

标签: c++ class


【解决方案1】:

这是forward declaration

作为 C 的遗留物,C++ 编译器以自上而下的方式工作(或多或少)。如果您希望您的类C 以某种方式(通过指针或引用)引用类A 或类B,那么编译器必须事先知道它们的存在。

【讨论】:

  • 在这种情况下呢? class A; class B { func(A a); } 所以在这种情况下,我不需要包含定义类 A 的标头,只需转发声明 A?
  • 不,在这种情况下,您只能声明指向A 的指针或引用。
  • 这不仅仅是 C 的后遗症。如果不是这样,编译器必须记住每个未声明的用法,如果在此之前未声明名称,编译器将在编译结束时返回它。这会减慢编译时间。另一种方法是多次解析代码,这也意味着速度非常慢。
  • @Nobody:确实。但是其他语言(Java 等)在这方面做得很好。当然,在带有模板的 C++ 中情况会更加复杂。
  • 我不是 java 专家,但据我所知,它是解释字节码,因此解释器只需要执行时的信息,其中每个需要的库都已加载,如果名称不是则抛出错误已知。
【解决方案2】:

这称为forward declaration。它允许您声明指向类型的指针,而不包括其定义。当然,由于就编译器而言此时该定义不存在,因此您只能声明指向该类型的指针或引用,因为编译器不知道如何构造所述类型的对象,即它不能不确定它的大小。

【讨论】:

    【解决方案3】:

    通过前向声明这样的类,您是在告诉编译器这些类存在,不用担心,您稍后会链接它们。

    这不是包含具有完整定义的头文件,如果编译器不需要知道类的样子就足够了。例如,如果您只对当前文件中的类使用 pointersreferences

    【讨论】:

      【解决方案4】:

      这称为前向声明,允许在已定义类的原型中使用这些类。

      【讨论】:

        猜你喜欢
        • 2023-04-02
        • 2017-02-27
        • 2019-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-15
        • 1970-01-01
        相关资源
        最近更新 更多