C++:在头文件中包含一个类定义

C++: including a class definition in a header file

本文关键字:包含一 定义 文件 C++      更新时间:2023-10-16

许多帖子都非常坚决地认为源代码不应该放在头中,头文件应该保持在最低限度。我一直用自己的代码来坚持这一点,但我想使用其他人的代码来实现特定的目标(这里记录了代码http://ftp.arl.mil/random/)。

我注意到,这基本上是一个定义类的巨大头文件。可以将其保留在头文件中吗?我是否应该将其全部复制到.cpp文件中,并创建一个只声明函数、结构等的新.h?

如果我按照我的建议将其拆分为.cpp和.h,它会起作用吗?或者类需要在头中才能被所有源代码访问吗?

需要在多个cpp文件中看到的声明(声明存在某种东西)应该放在头文件中。单个cpp文件的本地声明应该在cpp文件本身中。

定义(提供函数体或分配/初始化变量)通常应该放在cpp文件中,但并不总是这样。

您需要理解的问题是,如果编译器看到的是头文件而不是相应的cpp文件,那么它是否有足够的信息来完成它的工作。

例如:如果编译器已经看到声明(方法原型),则可以调用方法——除非该方法是泛型的(模板化方法或模板化类的成员)或内联的,在这种情况下,编译器也需要看到定义(方法体)。

因此,普通方法在cpp文件中;模板化方法位于头文件中;内联方法位于头文件中(依此类推)。

在其他情况下,定义属于头文件,包括静态成员常量。这一切都回到了一方面为编译器提供所需的信息,另一方面最小化独立可编译单元之间的耦合。同样,这里没有硬性规定,只有指导原则以及编写代码的开发人员的知识和经验。

.h文件通常在多个.cpp文件之间共享。全局变量和函数代码不应该在头文件中,因为它会在链接过程中产生重复。

常量、定义、函数头和类声明在头文件中都很好。您不必多次声明同一个东西,并且可以在.cpp文件之间共享定义。

源代码不应该放在头中,并且头文件应该保持在最低限度。

这是一个流行的断言,虽然它通常不是糟糕的建议,但你不应该从中得出绝对的结论。有时标题应该是最小的,不包括定义。有时情况恰恰相反。你为什么会这样或那样做是有原因的,但"人们说"不是其中之一。

考虑一下C++标准库。更好的是,考虑Boost。一些著名的C++专家说Boost是历史上设计最完善的C++库。但如果你看看这些库,你会发现它们在很大程度上只是巨大的头文件。这与"他们"所说的如何协调?

重点是:你必须了解某些文件设计成这样的原因,并对每种情况下的对错做出自己的决定。

我是否应该将其全部复制到.cpp文件并创建一个新的.h声明函数、结构等?

我想说可能不会。对我来说,这听起来像是一个维护噩梦的配方。按照图书馆作者的意愿使用第三方图书馆是我的第一本能。这样,你就不会脱离支持网格,也不会引入一系列新的复杂情况,你将完全依靠自己来解决。除非你有一个具体的、可证明的理由来改变库的架构,否则不要。"他们说"对我来说不是一个足够好的理由。