Скажем, у нас есть этот заголовочный файл:
MyClass.hpp
#pragma once
#include <vector>
class MyClass
{
public:
MyClass(double);
/* ... */
private:
std::vector<double> internal_values;
};
Теперь, когда мы используем #include "MyClass.hpp"
в каком-либо другом файле #include "MyClass.hpp"
или cpp, мы также эффективно #include <vector>
, несмотря на тот факт, что нам это не нужно. Причина, по которой я говорю, что в этом нет необходимости, заключается в том, что std::vector
используется только внутренне в MyClass
, но вообще не требуется, чтобы фактически взаимодействовать с этим классом.
В результате я мог написать
Версия 1: SomeOtherHeader.hpp
#pragma once
#include "MyClass.hpp"
void func(const MyClass&, const std::vector<double>&);
тогда как я наверное должен написать
Версия 2: SomeOtherHeader.hpp
#pragma once
#include "MyClass.hpp"
#include <vector>
void func(const MyClass&, const std::vector<double>&);
предотвратить зависимость от внутренней работы MyClass
. Или я должен?
Я очевидно понимаю, что MyClass
нуждается в <vector>
для работы. Так что это может быть больше философским вопросом. Но разве не было бы хорошо иметь возможность решить, какие заголовки будут отображаться при импорте (то есть ограничивать то, что загружается в пространство имен)? Так что каждый заголовок должен #include
то, что ему нужно, не уходя, неявно включая что-то, что нужно другому заголовку в цепочке?
Может быть, люди также смогут пролить свет на будущие модули С++ 20, которые, я считаю, касаются некоторых аспектов этой проблемы.