Правильнее всего в каждый файл включать необходимый ему набор зависимостей, пользоваться forward declaration для h файлов и делать #include в cpp файле. Тогда такие файлы можно использовать в другом проекте с минимальными правками.
Если есть набор каких-то общих типов данных для всего проекта, то я создаю файл common_types.h, в нем делаю #include <string> #include <vector>, свои типы через typedef'ы, а во все остальные файлы просто указываю #include "common_types.h".
В результате изменение в одном (возможно, второстепенном) заголовочном файле вынудит пересобираться весь проект. Bad practice.
Никакого смысла "жалеть строчек" в исходниках нет.
Adamos, пересборка всего проекта не такое уж и большое зло, чтобы всячески избегать его. Если вы изменяете какой-то общий для многих файлов тип данных, логично что нужно будет пересобрать эти файлы.
Жалеть строчки кода можно, чтобы не захламлять начало файла простыней из #include. Главное в работе программиста - это как код будет читать человек.
ittakir, если ваши проекты умещаются на экране целиком - что ж не пересобрать...
Если код будет читать не случайный человек, а программист, то простыня инклюдов любой длины займет у него максимум полсекунды на прокрутку вниз.
К ответу ittakir добавлю, что исключительно в целях снижения времени компиляции, пользуются такой штукой как precompiled headers, куда помещаются все те хедеры, которые РЕДКО меняются, но ЧАСТО используются (в большинстве cpp-шников). Например, хедеры стандартной библиотеки. В таких случаях common_types.h, о котором упомянул ittakir обычно и оформляется как прекомпилированный хедер.