Простой файл A.h, сложный B.h.
B.h включает A.h. Какой-то С.cpp включает и A.h и B.h в любом порядке. Фишка в использовании header-гуардов. Это вот эта штука:
#ifndef blablabla
#define blablabla
// определения
#endif // конец файла
Каждый файл имеет свое уникальное bla-bla-bla (обычно используют имя файла с путем). В таком виде можно без проблем включать любой файл кучу раз и, пока у вас нет циклических зависимостей, сколько угодно сложный проект собирается - надо только помнить всегда включать все, что вы используете.