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

时间:2014-01-09 16:13:29

标签: c++ class header

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

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

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

3 个答案:

答案 0 :(得分:7)

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

定义(提供函数体或分配/初始化变量)通常应该使用cpp文件,但并非总是如此。

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

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

因此普通方法进入cpp文件;模板化方法进入头文件;内联方法进入头文件(等等)。

还有其他情况,其中定义属于头文件,包括静态成员常量。这一切都回到给编译器一方面需要的信息,另一方面最小化单独的可编译单元之间的耦合。同样,没有严格的规则,只是指导程序与编写代码的开发人员的知识和经验相结合。

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

  

源代码不应该放在标题中,而且标题文件应该是   保持在最低限度。

这是一个流行的断言,虽然它通常不是建议,但你不应该从中得出绝对的结论。 有时标题应该是最小的,不包括定义。有时情况恰恰相反。你有理由去做其中一个,但“人们说”不是其中之一。

考虑C ++标准库。更好的是,考虑一下Boost。一些着名的C ++专家表示,Boost是历史上设计最精良的C ++库。但是如果你看看这些库,你会发现它们基本上只是巨大的头文件。这如何与“他们”所说的相协调?

重点在于:您必须了解某些文件按原样设计的原因,并对每种情况的正确和错误做出自己的想法。

  

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

我想说可能不是。这听起来像是对我来说维护噩梦的秘诀。这是我第一次使用第三方库的本能,就像图书馆作者所希望的那样。这样你就不会离开支持网格,并且你不会引入一系列新的复杂功能,你将完全靠自己来弄清楚。除非你有一个特定的,可证明的理由来改变图书馆的架构,否则不要。 “他们说”对我来说不够好。