Избегайте рекурсивных (?) #Include объявлений - PullRequest
2 голосов
/ 03 декабря 2011

Я использую пользовательскую библиотеку в проекте c ++, ведьма включает несколько заголовков std, но когда я включаю соответствующий заголовок в основной файл, это как если бы я включил все заголовки в пользовательский.
Чтобы было ясно:
пользовательский заголовочный файл:

#ifndef CUSTOM_H
#define CUSTOM_H

#include <vector>

//stuff

#endif

main.cpp:

#include <iostream>
#include "custom.h"

//here, let suppose that i do next:
vector<int> vec;

return 0;

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

Ответы [ 3 ]

5 голосов
/ 03 декабря 2011

Если custom.h использует std::vector в деталях реализации (и не отображается в сигнатурах вещей, которые вы определяете в заголовке), рассмотрите возможность перемещения #include <vector> в соответствующий файл custom.cpp.

Если вы не можете переместить включение из custom.h, потому что, скажем, вы передаете вектор в метод или из метода, то это действительно часть вашего интерфейса, и клиенты вашего заголовка должны будут знать об этом .

0 голосов
/ 03 декабря 2011

Проблема почти неизбежна.Если ваш файл заголовка должен содержать другой файл по какой-либо причине, нет способа «включить» его позже.

Существует один метод, который может минимизировать проблему, - идиома pimpl или непрозрачный указатель ,Перемещая реализацию класса в закрытый исходный файл, вы устраняете зависимости, которые заставили вас включить заголовок в первую очередь.

0 голосов
/ 03 декабря 2011

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

Для этого удалите #include <vector> из .h и добавьте его в Main.cpp выше , где вы включаете файл пользовательского заголовка. Если вы #include его ниже этого, он будет жаловаться на неопределенные типы. Также в каждом файле, использующем пользовательский заголовочный файл, они должны будут #include <vector> first .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...