3

大多数情况下,在一个程序中创建多个相互使用的类时,我喜欢只包含我需要的最少数量的头文件,以减少混乱。

例如,假设类 C 继承自包含类 A 的类 B。当然,由于类 B 包含类 A 作为成员,因此它需要包含a.hb.h. 但是,假设 C 还需要包含a.h. 像我一样懒惰,我只包含b.h(C 无论如何都需要包含),并且由于b.h已经包含a.h,我不需要再包含任何内容,并且它编译得很好。我的 .cpp 文件也是如此:我只包含标题,标题中包含的任何内容都将自动包含在我的 .cpp 文件中,因此我不包含它。

这是我的坏习惯吗?它是否使我的代码可读性降低?

4

3 回答 3

6

我坚持这个简单的规则:包含完全声明给定类所需的所有内容,但不多,并且不对包含从其他来源中提取的内容做出任何假设,即确保您的文件是自给自足的。

于 2010-12-11T09:57:22.590 回答
4

包含在不依赖外部包含顺序的情况下解析头文件所必需的内容(换句话说:使您的头文件自给自足)。

在您的情况下,如果c.h声明 aclass C继承自class B,显然您必须包含B.h. 但是,如果class A从未出现在 中c.h,我相信没有理由将其包含在内。b.h提及的事实A意味着b.h必须通过前向声明A或包含来解析需要解析的内容a.h

所以从我的角度来看,你正在做应该做的事情。

另请注意,如果由于某些原因c.h开始提及A,我会添加适当的包含或前向声明,这样我就不会依赖于为我做这件事的事实b.h

于 2010-12-11T09:58:30.970 回答
2

最好将每个标题都包含在您直接使用的定义中。

依赖其他标头之一来包含内容会使您的代码更加脆弱,因为它变得依赖于其外部类的实现。

编辑:

一个简短的例子:

  • B 类使用 A 类,例如使用散列机制 A 的散列表实现 B

  • 您创建了一个需要哈希表(即 B)和哈希算法(即 A)的类 C,用于其他目的。您包括 Bh 并省略 Ah,因为 Bh 无论如何都包含它。

  • Mary,你的一位同事,发现了一篇关于这种新的神话般的散列算法的论文,它降低了冲突的可能性,同时它需要的空间减少了 10%,速度提高了两倍。她(正确地)重写了 B 类以使用实现该算法的 D 类。由于 B 中不再需要 A 类,因此她还从 Bh 中删除了对它的所有引用

  • 您的代码中断。

编辑2:

有一些程序员(我偶尔也会为此感到内疚,当匆忙时)他们通过在他们的项目中使用“包含所有”头文件来处理这个问题。这应该避免,因为它会导致空前比例的命名空间污染。是的,windows.h在我看来,MSVC 就是其中之一。

于 2010-12-11T09:58:28.103 回答