【问题标题】:C++: What does having keyword class A; class B; class C;, etc. at the beginning of a file accomplish?C++:关键字class A是什么意思? B类; class C; 等在文件的开头完成?
【发布时间】:2021-12-03 03:48:23
【问题描述】:

我在一个文件中:

class A; 
class B; 
class C; 

这里只声明类是什么意思?

【问题讨论】:

  • 嗨,这些是前向声明。您能否查看this post 并告诉我们它是否回答了您的问题,或者您是否还有任何疑问?
  • 有时编译器不需要查看类的完整定义。在这种情况下,像您这样的前向声明可能会加快编译速度。在其他情况下,如果您不想依赖头文件的包含顺序,或者如果有 2 个类在各自的定义中使用另一个类,则它甚至可能是必要的。
  • 假定的副本完全不同——它通常询问前向声明。这个问题询问不完整类型的前向声明,它扮演着完全不同的角色。请重新打开,以便我回答。
  • @TonyK 是的,请。我正在寻找对此的深入解释。

标签: c++ class oop


【解决方案1】:

假设一个类B包含一个指向另一个类M的指针作为成员,但是在类C的定义中没有一个类M的成员被引用:

class C {
  ...
  M* pM ;
  ...
} ;

那么当定义类C 时,编译器不需要类M 的完整定义。但是编译器确实需要知道M 是一种类型。这就是这样的声明所达到的效果:要使上述代码 sn-p 有效,您可以简单地告诉编译器 Mclass,如下所示:

class M ;
class C {
  ...
  M* pM ;
  ...
} ;

您通常可以通过以正确的顺序定义类来避免这种情况。但是如果两个类包含指向彼此实例的指针,这是唯一的方法:

class B ;
class A {
  ...
  B* pB ; // This would fail without the declaration of `class B`
  ...
} ;
class B {
  ...
  A* pA ;
  ...
} ;

【讨论】:

    【解决方案2】:

    它通知编译器这些类将在你的程序中使用。这称为类声明。类似于声明方法,然后再定义。

    【讨论】:

    • 谢谢。让他们在那里的目的是什么?是否可以使用它们?纯粹为了澄清目的?你能解释更多吗?
    猜你喜欢
    • 2012-06-14
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 2011-11-21
    • 1970-01-01
    相关资源
    最近更新 更多