Управление прямыми объявлениями

Хорошо известно, что использование прямых объявлений предпочтительнее использования #includes в заголовочных файлах, но как лучше управлять прямыми объявлениями?

Некоторое время я вручную добавлял в каждый заголовочный файл прямые объявления, которые были необходимы этому заголовочному файлу. Однако в итоге я получил кучу заголовочных файлов, повторяющих те же полдюжины или около того прямых объявлений, что кажется избыточным, и ведение этих повторяющихся списков стало немного утомительным.

Прямые объявления типов (например, struct SensorRecordId; typedef std::vector SensorRecordIdList;) также немного многовато для дублирования в нескольких заголовочных файлах.

Поэтому я создал файл ProjectForwards.h, содержащий все мои объявления форвардов, и включал его везде, где это было необходимо. Сначала это казалось хорошей идеей - гораздо меньше избыточности, и гораздо проще поддерживать типовые определения. Но теперь, в результате столь активного использования ProjectForwards.h, каждый раз, когда я добавляю в него новый класс, мне приходится перестраивать весь мир, что замедляет разработку.

Так как же лучше всего управлять объявлениями форвардов? Должен ли я откусить от пули и повторять отдельные прямые объявления в нескольких подсистемах? Продолжать использовать подход ProjectForwards.h? Попробовать разделить ProjectForwards.h на несколько файлов SubsystemForwards.h? Какое-то другое решение, которое я упускаю из виду?

29
задан Josh Kelley 7 February 2012 в 16:56
поделиться