通常在程序中创建多个使用彼此的类时,我只想包含减少混乱所需的最少数量的头文件。
例如,假设类C继承自包含类A的类B.现在当然,因为类B包含类A作为成员,所以它需要在a.h
中包含b.h
。但是,假设C还需要包含a.h
。像我一样懒惰,我只包括b.h
(C需要包括其中),并且由于b.h
已经包含a.h
,我不需要包含更多内容,而且编译好。我的.cpp文件也是如此:我只包含标题,标题中包含的任何内容都将自动包含在我的.cpp文件中,因此我不会将其包含在那里。
这是我的坏习惯吗?它是否会降低我的代码的可读性?
答案 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
是其中一个案例。