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

C++ C++;:在头文件中包含类定义,c++,class,header,C++,Class,Header,许多帖子都非常坚决地认为源代码不应该放在头文件中,头文件应该保持在最低限度。我一直坚持用自己的代码来实现这一点,但我想使用其他人的代码来实现特定的目标(代码在这里有文档记录) 我注意到这基本上是一个定义类的巨大头文件。可以将其保留在头文件中吗?我是否应该将其全部复制到一个.cpp文件中,并创建一个新的.h文件来声明函数、结构等 如果我按照我的建议将其分为.cpp和a.h,它会起作用吗?还是所有源代码都需要在头中访问类?.h文件通常在许多.cpp文件之间共享。 全局变量和函数代码不应出现在头文件中

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

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


如果我按照我的建议将其分为.cpp和a.h,它会起作用吗?还是所有源代码都需要在头中访问类?

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

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

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

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

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

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

因此,通常的方法在cpp文件中;模板化方法放在头文件中;内联方法放在头文件中(等等)

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

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

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

考虑C++标准库。更好的是,考虑Boost。一些著名的C++专家曾说过,Boost是历史上最优秀的C++库。但是如果你看看这些库,你会发现它们基本上只是大部分的巨型头文件。这与“他们”所说的相符吗

关键是:您必须理解某些文件按这种方式设计的原因,并对每种情况下的对与错做出自己的判断

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


我想说可能不会。对我来说,这听起来像是一场维护噩梦。这将是我的第一本能,使用第三方图书馆他们的方式图书馆的作者打算使用它。这样,您就不会脱离支持网格,也不会引入一系列新的复杂问题,而这些问题将完全由您自己来解决。除非您有特定的、可证明的理由来改变库的体系结构,否则不要这样做。“他们说”对我来说不是一个足够好的理由。

分发大型头文件的意义在于不必与库/cpp文件链接。用户可以包含该文件一次,然后使用它并完成处理。我想如果这是一个tar.gz文件,你必须先编译它,然后才能使用它,那将是一件痛苦的事情。这与您在应用程序中处理头文件/cpp文件的方式不同。有理由将源代码放在头文件中。有理由不这样做。你应该理解这些问题,而不是试图遵循一个武断的规则。我不建议你这么做,除非在某些情况下,一个类只有一个.h是很酷的。但是我通常使用
inline
来完成这项工作。有一些很好的教程可以理解为什么要将所有内容都放在标题中或不放在标题中。检查问题中的信息。并非所有声明都应该放在标题中。并非所有定义都应放在源文件中。对不起,我不能同意你的看法,但我可以同意你的看法。除了了解编译过程是如何工作的,没有什么硬性规定。我将编辑“声明进入标题”条款,使之成为您可能同意的内容。谢谢,我同意这一点+1.