Циклические включения | C++

239
18 октября 2017, 07:06

Не могу разобраться с циклическими инклюдами.
Есть файл 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) классов. Но в этом случае не очень понимаю что делать, да и хотелось бы наконец разобраться.

Answer 1

Чтобы минимизировать зависимости в заголовках можно отделить интерфейс от реализации, внутренней структуры.

Т.е. в заголовках только интерфейс (функции). Все закрытые члены либо в классе-наследнике интерфейса, либо в структуре, которая является собственно реализацией, а в интерфейсе только объявлена в приватной части.

READ ALSO
CxxTest и деструкторы

CxxTest и деструкторы

Допустим есть некоторый класс:

234
Определение объектов в C++

Определение объектов в C++

Добрый день, интересует такой вопрос, по поводу определения объектов в С++Насколько я знаю объекты можно определять, как в стеке так и в куче

235
TCHAR или собственный макрос?

TCHAR или собственный макрос?

Недавно глянул в файл tcharh и увидел объявленный тип TCHAR, который по сути дела делает тоже самое что и этот макрос:

258
uniform_real_distribution is not uniform

uniform_real_distribution is not uniform

Пожалуйста, помогите мне понять этоПосле запуска этого фрагмента:

334