由于您说您是 C++ 新手,因此对于您的即时需求来说,这似乎有点过分。请记住,我要教给您的不是现在如何破解这个东西,而是将转移到未来项目和实际工作中的良好编码技能。
我建议的延伸目标和一般经验法则是:
在头文件中,#include 什么都没有,或者尽可能接近没有。
为什么?至少有两个原因。
首先,它保持快速编译。这很好,但不是真正的原因。真正的原因是:
其次,它减少了模块和硬耦合之间的相互依赖。模块之间的相互依赖是很容易创建的,当它成为问题时很难打破。
与此处发布的其他答案相反,不,您不需要#include
OtherClass
在此头文件中添加头文件。这个断言产生了两个问题:
- 怎么可能不包含标题?
- 为什么不包含标题,即使可以不包含?
为了:
头文件不需要知道任何关于OtherClass
. 只有翻译单元可以。TU 需要知道 的定义OtherClass
才能定义MyClass1
,但这很简单。考虑:
其他类.h:
#ifndef OTHERCLASS_H
#define OTHERCLASS_H
class OtherClass
{
};
#endif
MyClass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
class MyClass
{
public:
OtherClass mOC;
};
#endif
主.cpp:
#include <cstdlib>
#include "OtherClass.h"
#include "MyClass.h"
int main()
{
MyClass mc;
}
这里的翻译单元main.cpp
和它#include 的所有内容。整个包裹。由于您不直接编译头文件(例如自己编译),因此头文件不是翻译单元。
我建议我上面的建议比添加更好:
#include "OtherClass.h"
到 MyClass.h 因为它减少了两个对象之间的相互依赖。
这显然不是现在的问题,或者在这样的玩具程序中。当您尝试对底层类进行更改时,它会成为一个问题,在大型和复杂的代码库中。在那些时候,打破这些相互依赖变得非常困难,甚至可能是不可能的,这取决于你对设计的深思熟虑。这成为一个非常困难的教训。