Что такое соглашение, когда включаемый файл уже включен другим включаемым файлом?
Пример:
Класс Base объявлен в «base.h» и имеет несколько дочерних классов. База имеет виртуальный метод foo (Бар& bar) и, следовательно, включает в себя «bar.h». С надлежащей точки зрения соглашения, должны ли мы также включить «bar.h» в дочерние классы, учитывая, что дочерние классы включают в себя «base.h», который включает в себя «bar.h»?
Учитывая, что для объявления функции требуется только объявление параметров, вам необходимо включить соответствующий заголовок. Для известных базовых классов или типовprivate
члены данных, определение должно быть включено. Поскольку все остальное требует только объявления или детали реализации, не следует полагаться на включение косвенных заголовков.
Одна из идей заключается в том, что включение base.h и bar.h в child.h лучше. Несмотря на то, что это зависимость от виртуальной функции, в том числе bar.h указывает будущему разработчику (который может не иметь IDE) в объявление без необходимости читать base.h.
Для невиртуальной функции лучше использовать обе функции imho, так как другой разработчик может изменить содержимое base.h, не беспокоясь о зависимости child.h от bar.h.