У меня есть вопрос по поводу циркулярных включений, которые сводят меня с ума:
#include "A.hpp"#include "B.hpp"
int main()
{
A a();
B b();
return 0;
}
#ifndef _CLASS_A
#define _CLASS_A
#include "B.hpp"class A
{
public:
B* b;
struct A_t
{
int id;
};
};
#endif
#ifndef _CLASS_B
#define _CLASS_B
#include "A.hpp"
class B
{
class A; //Ok, with that I can use the class A
public:
int a;
A* b; // That work!
A::A_t *aStruct; // Opss! that throw a compilation error.
};
#endif
Вопрос в следующем: ¿Как я могу использовать структуру A_t в классе B?
Я попытался добавить предварительную декларацию, как:
struct A::A_t;
Но это, очевидно, работает.
Заменить включить в A.h
с предварительной декларацией.
#ifndef _CLASS_A
#define _CLASS_A
class B;
class A
{
public:
B* b;
struct A_t
{
int id;
};
};
#endif
Также обратите внимание, что
A a();
B b();
не будет создавать два экземпляра классов, но они являются объявлениями функций. Ты хочешь
A a;
B b;
Других решений пока нет …