我应该包含另一个标题中包含的文件吗?

时间:2010-12-11 09:52:07

标签: c++ class include code-readability

通常在程序中创建多个使用彼此的类时,我只想包含减少混乱所需的最少数量的头文件。

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

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

3 个答案:

答案 0 :(得分:6)

我坚持使用这个简单的规则:包含完全声明给定类所需的所有内容,但不要更多,并且不要假设包含从其他来源引入,即确保您的文件是自给自足的。

答案 1 :(得分:4)

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

在您的情况下,如果c.h声明继承自class C的{​​{1}},则显然您必须包含class B。但是,如果B.h中没有出现class A,我相信没有理由将其包括在内。 c.h提到b.h这一事实意味着A必须通过向前声明b.h或包含A来做出必要的解析。

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

另请注意,如果由于某些原因a.h开始提及c.h,我会添加相应的包含或转发声明,因此我不会依赖于A为此做出的事实我

答案 2 :(得分:2)

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

依赖其他一个标题来包含东西会使你的代码更加脆弱,因为它依赖于外部类的实现。

编辑:

一个简短的例子:

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

  • 为了某些其他目的,您需要创建一个需要哈希表(即B)和哈希算法(即A)的C类。你包括B.h并且因为B.h包括它而遗漏了A.h。

  • Mary,你的一位同事,发现了一篇关于这种新的神话般的哈希算法的文章,该算法可以减少碰撞的可能性,同时它需要的空间减少10%,速度提高一倍。她(正确地)重写了B类以使用D类,它实现了该算法。由于B中不再需要A类,因此她也从B.h。

  • 中删除了对它的所有引用
  • 您的代码中断。

编辑2:

有一些程序员(我有时也会因为匆忙而犯了这个问题)通过在他们的项目中使用“include-all”头文件处理这个问题。应该避免这种情况,因为它会导致命名空间污染无与伦比的比例。是的,在我看来,MSVC中的windows.h是其中一个案例。