我的规则是,头文件仅包括那些定义有问题的头文件使用的功能的文件。
假设您Foo在标头中具有指向某个类的指针和引用,但是标头从不刺入或实例化那些对象。在这种情况下,您不需要类的定义。您需要做的只是一个前向声明。
另一方面,如果您戳入类型的对象Foo,或者您具有类型的数据成员或变量,则前向声明是不够的Foo。现在您确实需要完整的定义,所以现在该到#include定义class的头文件了Foo。(或者,如果使用的是内联函数定义,则可能需要重新考虑该内联并将实现放在单独的源文件中。)