【问题标题】:class forward declaration类前向声明
【发布时间】:2013-01-15 19:11:52
【问题描述】:

我可以对一个类使用前向声明,以便在它被使用后将它的定义和实现放在程序的后面(类似于对函数所做的)?

(我需要将程序的多个源文件合并到一个文件中,并且我想将类的定义和实现放在文件末尾,以便main 位于文件顶部。)

【问题讨论】:

  • 你试过了吗?你有编译器错误吗?写一个简单的例子并试一试真的应该不会超过一分钟。
  • 或者,您可以将main 放在底部并忽略该问题...无论如何,答案是类的前向声明用途有限。
  • @abelenky 是的,来自 MS VS 1 的 errCode> 错误 C2079:'student_list' 使用未定义的类 'Student_list'

标签: c++ class forward-declaration


【解决方案1】:

是的,在一定程度上可以。

您必须意识到 C++ 编译器非常愚蠢,并且不会提前读取。这就是您必须使用函数原型的原因(以及其他一些原因)。 现在,编译器解析函数并不难。它只是查看函数的返回类型和函数参数的类型,并假设函数在那里,而不知道函数内部的实际内容,因为到那时它最终并不重要.

但是,类的内容确实很重要(例如,编译器需要知道类的大小)。但是还记得没有提前阅读吗?当您转发定义一个类时,编译器不知道其中有什么,因此会丢失很多关于它的信息。比如需要预留多少空间?

因此,您可以转发定义类,但不能将它们用作 类型。唯一可以用它做的事情(在它被具体声明之前)是使用指向它的指针(并将它用作函数返回类型和模板参数,作为指针 @Cheersandhth.-Alf)。

如果您需要使用的不是指针,您可能应该使用标头(如果您想了解更多信息,请阅读 this)。

【讨论】:

  • -1 "你唯一能用它做的事情(在它被具体声明之前),就是使用指向它的指针。是不正确的。很难猜出“值类型”是什么意思。但是“不能将它们用作值类型”的印象就像不能用于按值传递的形式参数一样,这也是不正确的。
  • @Cheersandhth.-Alf 在你评论之前就更正了它。
  • 所以你有一个指针,在你定义类之前你不能取消引用它,除了在代理类中使用它还有什么用处?
  • @csstd 你可以在标题中使用它。顺便说一句,我反对自己定义类,我总是为多个类提供多个头文件/cpp 文件。
【解决方案2】:

如果没有之前某个地方的类定义,你就不能使用任何类成员,也不能创建任何实例,但是你可以

  • 使用 T* 和 T& 类型,

  • 将 T 用于正式的返回类型和参数声明(是的,甚至按值),

  • 使用 T 作为模板参数,

可能还有更多,但以上是我立即想到的。

因此,如果这就是您所需要的,那么您就可以使用前向声明。

然而,在草图中,前向声明给你带来的只是添加的工作,在两个地方保持相同的代码,所以很难看出它的意义……


哦,我才想起来,前向声明的不完整类型有一个特别讨厌的未定义行为,即使用delete p,其中p 是指向不完整类型的指针。这要求析构函数是微不足道的。如果编译器是好的,那么它会发出警告,但不要指望它。


总之,我只需将main 放在该代码的最末尾,它所属的位置,避免所有问题。

【讨论】:

    猜你喜欢
    • 2021-12-25
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多