我个人使用c++的风格总是把类声明放在包含文件中,定义放在。cpp文件中,这很像Loki对c++头文件的回答,代码分离。不可否认,我喜欢这种风格的部分原因可能与我花了这么多年来编写Modula-2和Ada有关,这两者都有类似的规范文件和主体文件方案。

我有一个同事,他比我更了解c++,他坚持认为所有c++声明都应该尽可能地在头文件中包含定义。他并不是说这是一种有效的替代风格,甚至不是一种稍微更好的风格,而是说这是一种新的普遍接受的风格,现在每个人都在使用c++。

我不像以前那么灵活了,所以在我看到更多的人和他在一起之前,我并不急于加入他的行列。那么这个习语到底有多普遍呢?

只是给答案一些结构:现在的方式™,非常常见,有点常见,不常见,还是疯狂?


当前回答

模板代码应该只在头文件中。除此之外,除了内联之外的所有定义都应该在.cpp中。最好的参数是遵循相同规则的std库实现。你不会不同意std lib开发人员在这方面是正确的。

其他回答

我认为你的同事很聪明,你也是对的。

我发现把所有东西都放在头文件中的有用的事情是:

不需要写和同步头文件和源文件。 结构很简单,没有循环依赖迫使编码器做出“更好”的结构。 便携,易于嵌入到新项目中。

我同意编译时间的问题,但我认为我们应该注意到:

源文件的改变很可能会改变头文件,从而导致整个项目重新编译。 编译速度比以前快多了。而如果你的项目建设时间长、频率高,这可能说明你的项目设计存在缺陷。将任务分离到不同的项目和模块中可以避免这个问题。

最后,我只是想支持你的同事,只是在我个人看来。

为了增加更多的乐趣,你可以添加.ipp文件,其中包含模板实现(包含在.hpp中),而.hpp包含接口。

除了模板化的代码(取决于项目,这可能是大部分或少数文件),还有正常的代码,这里最好将声明和定义分开。在需要的地方也提供前向声明——这可能会影响编译时间。

我认为把所有的函数定义都放在头文件中是非常荒谬的。为什么?因为头文件被用作类的PUBLIC接口。这是“黑匣子”的外部。

当您需要查看一个类以引用如何使用它时,您应该查看头文件。头文件应该给出它能做什么的列表(注释以描述如何使用每个函数的细节),它应该包括一个成员变量列表。它不应该包括每个单独的函数是如何实现的,因为那是一船不必要的信息负载,只会使头文件混乱。

如果这个新方法真的是方法,我们可能在我们的项目中遇到了不同的方向。

因为我们尽量避免在头文件中出现不必要的东西。这包括避免头级联。头文件中的代码可能需要包含一些其他头文件,而这些头文件又需要另一个头文件,以此类推。如果我们被迫使用模板,我们尽量避免在标题中使用太多模板。

如果适用,我们还使用“不透明指针”模式。

通过这些实践,我们可以比大多数同行更快地构建。是的……更改代码或类成员不会导致巨大的重构。

恕我直言,他只有在做模板和/或元编程时才有价值。前面已经提到了将头文件限制为声明的很多原因。他们只是…头。如果您希望包含代码,则将其编译为库并将其链接起来。