Как создавать классы / хедеры так, чтобы программа компилировалась независимо от порядка директив #include ?
1. следить, чтобы хедеры содержали только объявления без определений (исключения - inline-функции, статические функции/переменные и константы).
2. использовать флаги включения:
#ifndef MY_HEADER_H
#define MY_HEADER_H
//содержимое хедера
...
#endif //MY_HEADER_H
3. следить, чтобы все используемые в хедере типы данных были предварительно объявлены:
- в начале хедера подключить заголовки от которых он зависит;
- для разрешения циклических ссылок внутри хереда используются forward declaration;
Если я ничего не забыл, то этого должно быть достаточно, чтобы не обращать внимания на порядок включения заголовков в cpp-файлы.