In general, the best approach is always "include as little as you can get away with". If you don't need a definition, use only a declaration. And you'd be surprised at how rarely you need a definition. For example, if you had this in a header file:
Code:
class Teenager: public Person{
public:
Teenager(Mother &m, Father &f);
Mother GetMother();
Father GetFather();
void IgnoreParents();
void BeMoody();
private:
Mother & m_mom;
Father * m_dad;
};
In the above class definition, ONLY "Person" must be defined. Mother and Father must only be declared. So you can get away with merely this in that header:
Code:
#include "Person.h" // Can't get around this include
// But we don't need to include "Mother.h" or "Father.h"
// This works equally well:
class Mother;
class Father;