Хорошо известно, что использование прямых объявлений предпочтительнее использования #includes в заголовочных файлах, но как лучше управлять прямыми объявлениями?
Некоторое время я вручную добавлял в каждый заголовочный файл прямые объявления, которые были необходимы этому заголовочному файлу. Однако в итоге я получил кучу заголовочных файлов, повторяющих те же полдюжины или около того прямых объявлений, что кажется избыточным, и ведение этих повторяющихся списков стало немного утомительным.
Прямые объявления типов (например, struct SensorRecordId; typedef std::vector
) также немного многовато для дублирования в нескольких заголовочных файлах.
Поэтому я создал файл ProjectForwards.h
, содержащий все мои объявления форвардов, и включал его везде, где это было необходимо. Сначала это казалось хорошей идеей - гораздо меньше избыточности, и гораздо проще поддерживать типовые определения. Но теперь, в результате столь активного использования ProjectForwards.h
, каждый раз, когда я добавляю в него новый класс, мне приходится перестраивать весь мир, что замедляет разработку.
Так как же лучше всего управлять объявлениями форвардов? Должен ли я откусить от пули и повторять отдельные прямые объявления в нескольких подсистемах? Продолжать использовать подход ProjectForwards.h
? Попробовать разделить ProjectForwards.h
на несколько файлов SubsystemForwards.h
? Какое-то другое решение, которое я упускаю из виду?