我可以对一个类使用前向声明,以便在使用它之后将它的定义和实现放在程序中(类似于对函数所做的事情)?
(我需要将程序的多个源文件合并到一个文件中,并且我想将类的定义和实现放在文件的末尾,以便位于文件main
的顶部。)
我可以对一个类使用前向声明,以便在使用它之后将它的定义和实现放在程序中(类似于对函数所做的事情)?
(我需要将程序的多个源文件合并到一个文件中,并且我想将类的定义和实现放在文件的末尾,以便位于文件main
的顶部。)
是的,在某种程度上,你可以。
您必须意识到 C++ 编译器非常愚蠢,并且不会提前阅读。这就是您必须使用函数原型的原因(以及其他一些原因)。现在,编译器解析函数并不难。它只是查看函数的返回类型和函数参数的类型,并假设函数在那里,而不知道函数内部的实际内容,因为到那时它最终并不重要.
但是,类的内容确实很重要(例如,编译器需要知道类的大小)。但是还记得没有提前阅读吗?当您转发定义一个类时,编译器不知道其中有什么,因此会丢失很多关于它的信息。例如需要预留多少空间?
因此,您可以转发定义类,但不能将它们用作值类型。唯一可以用它做的事情(在具体声明之前)是使用指向它的指针(并将其用作函数返回类型和模板参数,作为@Cheersandhth.-Alf 的指针)。
如果您需要使用的不是指针,您可能应该使用标头(如果您想了解更多信息,请阅读此内容)。
如果没有之前某处的类定义,您将无法使用任何类成员,也无法创建任何实例,但您可以
使用 T* 和 T& 类型,
将 T 用于正式的返回类型和参数声明(是的,甚至按值),
使用 T 作为模板参数,
可能还有更多,但以上是我立即想到的。
因此,如果这就是您所需要的,那么您就可以使用前向声明了。
但是,在草图中,前向声明给你带来的只是额外的工作,在两个地方维护相同的代码,所以很难看出它的意义……
哦,我才想起来,前向声明的不完整类型有一个特别讨厌的未定义行为,即使用delete p
wherep
是指向不完整类型的指针。这要求析构函数是微不足道的。如果编译器很好,那么它会发出警告,但不要指望它。
总而言之,我只想把它main
放在该代码的最后,它所属的位置,避免所有问题。