Два класса включают друг друга, что не так со следующим кодом?

0

У меня есть 2 класса: "A" и "B",

ах

#ifndef _A_H__
#define _A_H__
#include "B.h"

class A
{
public:
    struct Test 
    {
        int qq;
    };
    B *b;
};
#endif

Bh

#ifndef _B_H__
#define _B_H__
#include "A.h"
class A;
class B
{
public:
    A *a;
    A::Test* qq;
};
#endif

Но это не может скомпилировать успех. Кто может сказать мне A::Test* как член в B

  • 1
    в чем ошибка компиляции?
  • 1
    почему тэг c когда это концепция C++ ? [Удалено]
Показать ещё 1 комментарий
Теги:
class

2 ответа

4
Лучший ответ

У вас есть круговая зависимость, файл заголовка 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
-2

Напишите Bh следующим образом:

#ifndef _B_H__
#define _B_H__

class A;
class B
{
public:
    A *a;
    A::Test* qq;
};
#endif
  • 0
    Это не скомпилируется. Вам нужно определение A чтобы использовать вложенные имена, такие как A::Test .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню