2010-12-11 140 views
2

大多数情况下,当在一个使用对方的程序中创建多个类时,我只想包含我需要的最少数量的头文件以减少混乱。我应该包含另一个头文件中包含的文件吗?

例如,C类继承自包含A类的B类。当然,因为B类包含A类作为成员,所以它需要在b.h中包含a.h。但是,让我们假设C还需要包含a.h。作为我的懒惰,我只包括b.h(C需要包括反正),并且因为b.h已经包括a.h,我不需要再包括任何东西,它编译得很好。我的.cpp文件一样:我只是包含标题,标题中包含的任何内容都会自动包含在我的.cpp文件中,因此我不在其中。

这是我的一个坏习惯吗?它是否会让我的代码不易读?

回答

4

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

就你而言,如果c.h宣告class C继承自class B,显然你必须包含B.h。但是,如果class A从未出现在c.h中,我相信没有理由包含它。 b.h提到A这一事实意味着b.h必须通过正向声明A或包括a.h进行必要的解析。

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

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

6

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

2

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

依赖于其他头文件之一来包含东西,会使代码更加脆弱,因为它依赖于外部类的实现。

编辑:

简单例子:

  • B类使用类A,例如使用散列机制的散列表实现方式B您创建了需要散列表(即B)和散列算法(即A)用于其他一些目的的类C。你包括B.h并且省略A.h,因为B.h包括它。

  • 玛丽,你的一位同事,发现了一篇关于这个新的神话般的哈希算法的论文,它减少了碰撞的可能性,而它需要的空间减少了10%,速度也增加了一倍。她(正确地)重写类B以使用实现该算法的类D。由于B中不再需要A类,所以她也从B.h.中删除所有对它的引用。

  • 您的代码被中断。

编辑2:

有一些程序员(和我偶尔会犯这样也着急时)谁由具有“包括所有”头文件处理这个问题在他们的项目中。这应该避免,因为它会导致无与伦比的命名空间污染。是的,MSVC中的windows.h是我认为的其中一种情况。