繁体   English   中英

类前向声明

[英]class forward declaration

我可以对类使用前向声明,以便在使用后将其定义和实现放到程序中(类似于对函数所做的事情)吗?

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

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

您必须认识到C ++编译器非常愚蠢,并且不会提前阅读。 这就是为什么您必须使用函数原型的原因(还有其他原因)。 现在,编译器不难解析一个函数。 它只是查看函数的返回类型和函数的参数类型,并假设该函数在那里,而无需任何有关函数内部实际内容的知识,因为在那一点上它最终并不重要。

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

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

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

如果没有早期的类定义,就不能使用任何类成员,也不能创建任何实例,但是可以

  • 使用T *和T&类型,

  • 使用T表示正式的返回类型和参数声明(即使按值也可以),

  • 使用T作为模板参数

甚至更多,但以上是我立即想到的事情。

因此,如果仅此而已,那么您就可以使用前向声明。

但是,在草拟的情况下,前瞻性声明为您提供的所有东西都是增加的工作 ,在两个地方都维护相同的代码,因此很难看出要点……


哦,我刚刚记得,与前向声明的不完整类型相关联的是一个特别讨厌的“未定义行为”,即使用delete p ,其中p是指向不完整类型的指针。 这要求析构函数是琐碎的。 如果编译器是好的,它会发出警告,但不要指望它。


总而言之,我只将main放在该代码的末尾 (即它所属的地方),避免了所有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM