Задать вопрос
@sitev_ru
sitev.ru - мой блог ...

Существуют ли правила подключения include-файлов в С++?

Написал проект, в котором используется много файлов, в каждом по несколько классов и они ссылаются друг на друга. И вот в какой-то момент возникла неразрешимая ошибка с которой не так просто сразу разобраться. Используется класс, который как бы не описан (хотя, конечно же, он описан)...

Может существует какие-то правила, используя которые не возникнет таких ошибок?

Как сделал я. Я описал один h-файл, в него сложил остальные h-файлы и подключаю этот главный h-файл только в cpp-файлах. Раньше вроде как прокатывал такой подход). Здесь исходник: https://github.com/sitev/cms
  • Вопрос задан
  • 928 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 2
15432
@15432
Системный программист ^_^
Я в проектах делаю так:
  • в шапке .h файла #pragma once
  • в .h файле только описание класса - члены, методы, иногда структуры
  • инклюдим в .h другие .h только если этого требует описание класса
  • всё остальное необходимое для реализации инклюдим в .cpp
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Незыблемых правил два.
1. В CPP первым — свой хедер. Это даёт уверенность, что в хедере нет недостающих включений.
2. Избегать циклической зависимости по интерфейсам. Делить программу на слои и не включать ничего из верхних слоёв.

Если уж второе не получилось — есть три решения, каждое из которых решает свою задачу.
1. Forward declaration, полумера против сильной связанности классов.
// Хедер 1
class Master;

class Slave {
  Master* master;
}

// Хедер 2
class Master {
  Slave slave;
}


2. Разорвать порочный круг интерфейсом.
// Хедер 1
class Master {  // interface
public:
  virtual void enumSlaves(const EnumSlavesCallback& v) = 0;
  virtual ~Master() = default; 
}

class Slave {
  Master* master;
}

// Хедер 2
class MyMaster :  public Master {
public:
  Slave slave;
  void enumSlaves(const EnumSlavesCallback& v) override {}
}


3. Вынести общие типы/функции в отдельный хедер под названием someDefines.h или someUtils.h.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
почитайте впро предкомпилированные заголовки
https://en.wikipedia.org/wiki/Precompiled_header
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы