Daniro_San
@Daniro_San
Программист

Где лучше включать заголовочные файлы?

Для примера:
У меня есть класс, описанный в MyClass.h, и его реализация в MyClass.cpp
Описание класса требует только string
//MyClass.h
#pragma once
#include<string>
class MyClass {
public:
 std::string ExampleFunction();
}

Но его тело в MyClass.cpp может использовать другие хедеры помимо string, например vector.
//MyClass.cpp
#include "MyClass.h"
//Дальше описание тела

Так вот вопрос: где лучше подключить эти хедеры - в MyClass.h или в MyClass.cpp ?
  • Вопрос задан
  • 343 просмотра
Решения вопроса 2
@teugen
Призрак алкоголизма.
Вот, например, хороший ответ.

This rule means that if the header uses a type - such as 'FILE *' or 'size_t' - then it must ensure that the appropriate other header ( or for example) should be included. A corollary, often forgotten, is that the header should not include any other header that is not needed by the user of the package in order to use the package. The header should be minimal, in other words.


Вкратце: включений в заголовке должно быть как можно меньше, при этом в нём должны быть включены все заголовки, необходимые для беспрепятственной работы кода, в нём описанного.

В вашем случае, если vector используется исключительно в реализации и в описании blackbox'a никак себя не проявляет, включать его нужно в .cpp
Ответ написан
Комментировать
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Выше всё верно написали, но перед тем как просто следовать рекомендациям, хорошо бы ответить на вопрос: "зачем?". Все дело в основном (хотя бывают и другие случаи) в скорости компиляции программы. Поменяли что-то в заголовочнике, который включен в 100500 других заголовочников и ушли отдыхать на 15 минут, пока всё это компилится в 8 потоков :) Неприятно в общем. Т.е. золотое правило: чем меньше включено в заголовочник, тем лучше. Правда, в 17ом стандарте будут модули и эта проблема решится (ну всё равно тонны легаси никто сразу вот так прям не портирует, так что еще лет 5-10 эти знания будут актуальны).
Помимо этого, для увеличения скорости компиляции можно использовать pimpl (но осторожно, это не основное предназначение этой техники!) и программы вроде ccache (как, вы всё еще не на линуксе?).
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C++
К teugen добавлю, что если вы используете не значение класса/структуры, а указатель на него, то в хедер вместо инклуда другого хедера можно вставить объявление класса:

#pragma once
class ExampleClass;
class MyClass {
public:
 ExampleClass* ExampleFunction();
};

а инклуд определения класса делать там, где без него уже никак - например там, где вызываются методы класса или создаются его экземпляры.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы