Если определение (не объявление) класса B появляется перед объявлением класса A, то ваш случай # 1 должен скомпилироваться нормально.
Как указал Оксли , причина этого в том, что C ++ должен знать, сколько памяти требуется для объекта B, и он не может сделать это без определения B.
Однако, если вы используете указатель (как в случае № 2), необходимый объем памяти известен, потому что все указатели занимают одинаковый объем памяти (32-разрядный или 64-разрядный, в зависимости от системы).
Итак, для случая № 2 все, что вам нужно, это объявление B перед определением A. (примечание: объявление, а не определение! Конечно, определение также не повредит, но это не обязательно необходимо) .
Просто чтобы убедиться, что я никого не путаю, (эй, может быть, у меня нет терминологии C ++)
объявление: объявляет о существовании класса или функции, но ничего не говорит о том, что это такое.
, например
class A; //forward declaration
class C
{
A * a;
// .....
};
определение: фактически определяет класс или функцию. Хотя для класса он не обязательно определяет его полностью, но он определяет всех его членов.
class A
{
int a;
int b;
void some_method(); //not defined here, only declared, but it's ok
};