情景:
foo.h中:
#include <vector>
class foo {
public:
std::vector<int>* getVector();
/* ... other methods declarations ... */
}
Foo.cpp中:
#include "foo.h"
#include <vector>
/* ... other methods definitions using std::vector ... */
std::vector<int>* foo::getVector() {
return new std::vector<int>();
}
我希望.cpp独立于标头中未来可能发生的任何变化。如果由于某种原因,类的接口发生了变化并且可以消除<vector>
的依赖性,那么我冒着.cpp中的其他方法也会失去包含的风险。
重复在.cpp和.h中包含<vector>
是否正确?这种做法是否有意义,还是应该依靠标题中包含的内容?
答案 0 :(得分:15)
包括您需要的内容,仅此而已。
在多个.h文件和多个.cpp文件中包含相同的头文件本身并不是问题。标题保护可有效缓解多次包含文件的问题。
如果你开始尝试避免多次包含同一个文件,它实际上可能是负面的,因为它通常会导致“mega-include文件”,其中包括整个项目中所需的所有。这很糟糕,因为对任何头文件的一次更改会导致所有内容重新编译。
如果您担心同时包含相同文件的.h / .cpp文件,请遵循以下准则:
答案 1 :(得分:1)
每个文件都应该包含它所需要的内容而不是更多内容。在您的标题及其实现的特定情况下,.cpp中的冗余声明没有帮助。如果标题改变得足以使函数不再需要返回向量,则无论如何都需要重新访问.cpp。
答案 2 :(得分:1)
在.cpp文件中,只包含特定于实现的内容(实际上是.cpp文件),而不重复已包含在标头中的内容。这样,当有人查看您的代码时,他也可以更好,更清晰地理解您的代码。
了解哪些依赖项仅特定于实现非常有用,例如,当您使用另一个依赖项(同时保留接口)进行升级/替换时。
答案 3 :(得分:1)
在标头中包含尽可能少的文件,并且只将它们包含在需要它们的.cpp文件中。您的foo.h
头文件可能包含在许多其他.cpp文件中,这些文件不需要来自其他头文件(在本例中为vector.h)的声明,从长远来看会导致更长的编译和代码不太明确。