Одним из недостатков может быть отсутствие сокрытия / инкапсуляции информации.
Я предпочитаю иметь самый минимальный заголовочный файл, какой только могу. Это означает, что я не обязан продолжать поддерживать так много функций. Если я хочу что-то изменить, и это что-то не было открыто в публичном заголовке, есть гораздо больше шансов, что я могу изменить это внутренне для класса, не затрагивая никого другого.
EDIT:
Люк попросил привести пример, так что вот так:
Предположим, у вас есть класс с именем Car
. И единственное, для чего вы его построили, - это перейти из точки А в точку Б. Лично я предпочел бы сохранить свой заголовочный файл в классе: Car
и метод Drive
. Исходя из того, как вы сформулировали свой вопрос («все классы, которые я могу»), я ожидаю найти такие классы, как «DieselEngine», «PetrolEngine», «HybidEngine» и тому подобное, в вашем заголовочном файле. Проблема в том, что другие люди, работающие над вашим проектом (или вы, со временем), начинают использовать эти открытые классы. Теперь, два года спустя, вы решаете: «Хм ... этот класс PetrolEngine действительно вызывает у меня проблемы. Я думаю, что я просто собираюсь удалить его и заменить его на HybridEngine полностью в моем классе автомобилей» - ну, теперь PetrolEngine включено в 100 других файлов по причинам, которые вы не понимаете - и теперь вы вынуждены держать PetrolEngine (и работать как раньше) для всех тех парней, которые использовали его в некоторых, говорят, что вы на самом деле не уверены - потому что у вас не было надежного рабочего «контракта» на то, как вы хотели, чтобы этот класс использовался в первую очередь. Это была деталь реализации того, чего вы действительно хотели достичь - построить автомобиль.
РЕДАКТИРОВАТЬ, чтобы обсудить комментарии о сокрытии информации:
Если все, что вы делаете, это строго вперед, объявляя имя класса / структуры - ну, я думаю, я бы снова спросил «почему». Если я являюсь потребителем вашего заголовочного файла и класса (классов), и я не могу ничего сделать с этим классом - и он не представлен как параметр или тип возврата API вашего основного класса - тогда зачем вообще его выставлять
Если вы используете его для проверки безопасности типов времени компиляции для непрозрачных структур данных - хорошо - это одно. Но то, как вы сформулировали свой вопрос, показало мне, что все в заголовочном файле само собой разумеется.