Вы не можете сделать что-то вроде этого:
class A {
B b;
};
class B {
A a;
};
Самая очевидная проблема в том, что компилятор не знает, как много нужно для создания класса A, поскольку размер B зависит от размера A!
Однако вы можете сделать это:
class B; // this is a "forward declaration"
class A {
B *b;
};
class B {
A a;
};
Объявление класса B в качестве прямого объявления позволяет вам использовать указатели (и ссылки) на этот класс, не имея при этом полного определения класса.