Не могу разобраться с циклическими инклюдами.
Есть файл a.h
, в нем находится определение класса A
:
// a.h
#ifndef A_H
#define A_H
#include <c.h>
enum class Props {*};
class A
{
***
private:
C var;
}
#endif // A_H
А также файлы b.h
и c.h
с определениями соответствующих классов:
// b.h
#ifndef B_H
#define B_H
#include "a.h"
class B
{
prublic:
void foo(Props p); // 'Props' has not been declared
}
#endif // B_H
// c.h
#ifndef C_H
#define C_H
#include "b.h"
class C : public B
{
***
}
#endif // C_H
Объясните пожалуйста как это работает и как этого избегать. Раньше сталкивался с этим. Решалось предварительным объявлением (forward declaration) классов. Но в этом случае не очень понимаю что делать, да и хотелось бы наконец разобраться.
Чтобы минимизировать зависимости в заголовках можно отделить интерфейс от реализации, внутренней структуры.
Т.е. в заголовках только интерфейс (функции). Все закрытые члены либо в классе-наследнике интерфейса, либо в структуре, которая является собственно реализацией, а в интерфейсе только объявлена в приватной части.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый день, интересует такой вопрос, по поводу определения объектов в С++Насколько я знаю объекты можно определять, как в стеке так и в куче
Недавно глянул в файл tcharh и увидел объявленный тип TCHAR, который по сути дела делает тоже самое что и этот макрос:
Пожалуйста, помогите мне понять этоПосле запуска этого фрагмента: