Подумайте о памяти компьютера на секунду здесь.
class B;
class A {
byte aa;
B ab;
};
class B {
byte bb;
A ba;
};
A x;
Теперь вопрос, на который должен ответить компилятор: Сколько места я должен зарезервировать для x
?
Посмотрим.Первый байт x
равен byte aa;
.Достаточно просто.Это 1 байт.
Далее идет B ab;
.Давайте посмотрим, что там.
Первый байт x.ab
- это byte bb;
.Пока это 2 байта для x
.
Далее, это A ba;
.Давайте посмотрим, что там.
Первый байт x.ab.ba
- это byte aa;
.Пока это 3 байта для x
.
И так далее, и так далее до бесконечности.
Насколько велика x
?Правильный ответ, конечно, *** OUT OF CHEESE ERROR ***
.
Компилятор на самом деле не делает этого, потому что знает, что не может обработать этот случай - поэтому синтаксис не допускает циклическое сдерживание в первую очередь.
Вот диаграмма содержания x
в этом примере:
Диаграмма http://i56.tinypic.com/28c0oiq.png
ОБНОВЛЕНИЕ
Видимо, я забыл включить решение здесь.Теперь, когда вы понимаете, в чем проблема, решение должно быть довольно простым.Используйте указатели. Либо используйте указатель от A
до B
, и пусть B
включает A
, как это уже делает, или наоборот, или два указателя.Тогда у вас не будет циклического включения - если B
не содержит копию A
, а просто указатель на нее, это решает всю проблему здесь.