Обычно каждый уменьшает зависимости путем объявления классов вперед. Вот пример. Скажем, у нас есть два обязательных заголовка, parser.h и token.h, определенные следующим образом:
parser.h:
class Parser
{
public:
void doFoo();
void doBar();
// ... lots of other stuff
};
token.h:
class Token
{
public:
void doQuux();
void doBaz();
// ... continues for a while
};
Теперь, имея "пользователя, h", который использует эти два, вместо того, чтобы писать это как:
#include "parser.h"
#include "token.h"
void useParserAndToken( Parser &, Token & );
вы пишете
class Parser;
class Token;
void useParserAndToken( Parser &, Token & );
Таким образом, вы в итоге говорите, что есть классы Parser и Token, но как они точно определены, не имеет значения. Это приводит к более быстрой компиляции.
Чтобы уменьшить зависимости, вы обычно только заранее объявляете классы. С другой стороны, дублирование объявлений не имеет особого смысла.