Разрешить циклическое включение 3 классов в C ++ - PullRequest
2 голосов
/ 01 декабря 2019

У меня есть 3 класса, которые я собираюсь обозначить как A, B и C (имена в этом примере произвольны). Все 3 из этих классов состоят из заголовочного файла и cpp-файла каждый.

У меня есть следующие зависимости:

  • A должен знать B, так как A имеет члентип B
  • B должен знать A и C, так как B имеет члены обоих типов
  • C должен знать A, поскольку C имеет член типа A

Я уже опробовал несколько вариантов (включая этот заголовок здесь, предварительное объявление класса там), но компиляция никогда не была успешной. Я также не мог извлечь какую-либо полезную информацию из ответов на проблемы, которые решали проблемы циклического включения только между 2 классами.

РЕДАКТИРОВАТЬ: Вот минимальный (и, надеюсь, достаточный) пример моей текущей настройки:
Ах

class A {
private:
    B myB;
};

Bh

class B {
private:
    A* myA;
    C myC;
};

Ch

class C {
private:
    A* myA;
}

Возможно, я также должен отметить, что B :: myA и C :: myA всегда будут указывать натот же экземпляр.

1 Ответ

1 голос
/ 01 декабря 2019

Поскольку класс C включает только указатель на класс A, ему не требуется полное определение для A или B (чтоне использует);так что достаточно просто заявления , объявляющего A классом:

Ch

class A; // Declare that A is a class - then we can have a pointer to it...
class C {
private:
    A* myA;
}

Класс B нуждается в определении C, потому что он включает экземпляр из C;и, подобно классу C, простое объявление A как класса (как это уже сделано в C.h) будет делать:

Bh

#include "C.h" // Note: This header already declares "A" as a class!
class B {
private:
    A* myA;
    C myC;
};

Class A потребности определение из B, поскольку оно содержит экземпляр из B. Но обратите внимание, что B.h уже включает C.h:

А *

#include "B.h"
class A {
private:
    B myB;
};

Обратите внимание, что любые другие файлы, которые используют один или несколько из A, B и Cнужно только включить заголовок A.h, так как он сам включает остальные.

...