У меня есть 2 класса: "A" и "B",
#ifndef _A_H__
#define _A_H__
#include "B.h"
class A
{
public:
struct Test
{
int qq;
};
B *b;
};
#endif
#ifndef _B_H__
#define _B_H__
#include "A.h"
class A;
class B
{
public:
A *a;
A::Test* qq;
};
#endif
Но это не может скомпилировать успех. Кто может сказать мне A::Test*
как член в B
У вас есть круговая зависимость, файл заголовка Ah
нуждается в Bh
который нуждается в Ah
и так далее в вечности.
Единственный способ разбить цикл - не включать один из файлов заголовков в другой.
В вашем случае файлу заголовка Bh
действительно нужен файл заголовка Ah
, так как класс B
использует членов класса A
, поэтому вам нужно изменить, чтобы заголовочный файл Ah
не включал Bh
. Это просто, потому что класс A
действительно не использует или не должен знать ничего о содержимом класса B
, только тот класс B
существует, поэтому измените Ah
следующим образом:
#ifndef _A_H__
#define _A_H__
// Declare that class B exists
class B;
class A
{
public:
struct Test
{
int qq;
};
// The compiler knows that a class B exists, so we can have a pointer
// to that class here. To declare a pointer to some type, the compiler
// doesn't need the actual definition of the type, just know that the
// type exists.
B *b;
};
#endif
Напишите Bh следующим образом:
#ifndef _B_H__
#define _B_H__
class A;
class B
{
public:
A *a;
A::Test* qq;
};
#endif
A
чтобы использовать вложенные имена, такие как A::Test
.
c
когда это концепцияC++
? [Удалено]