Java - это «современный» компилятор. Модули правильно скомпилированы, включая их перекрестные ссылки. C ++ - это «старый» компилятор, достаточно умный, чтобы делать все за один проход над исходным кодом. Однако это подразумевает, что он позволит вам ссылаться на A из B и даже B из A, при условии, что вы будете использовать только указатели на них. На самом деле, когда C ++ компилирует A, он не знает, что у вас есть класс B. Хорошо, мы можем исправить это, предшествуя объявлению A:
class B;
Что равносильно тому, чтобы сказать компилятору: хорошо, где-то есть класс B. Фантастика. Теперь вы можете поместить параметры типа "B * b", потому что указатель - это просто указатель (4 байта в 32-битных архитектурах ...). Однако вы не сможете скомпилировать что-то вроде, скажем, параметра по значению «B b», потому что, помимо прочего, компилятор должен знать размер класса B, поскольку он даже не скомпилировал это еще.
Существуют и другие соображения относительно вашего кода, особенно в отношении передачи this , ( this - указатель), но на эти аспекты все еще дан ответ.