Компилятор уже говорит вам, что не так: A имеет данные-члены b неопределенного типа.Ваша предварительная декларация:
class B;
- это всего лишь декларация, а не определение.Поскольку класс A содержит экземпляр B напрямую (а не только указатель на B), компилятору необходимо знать точный размер B: ему нужно его определение, а не просто объявление, то есть обещание, что B будет существовать в какой-то момент.
Самое простое, что можно сделать здесь, это изменить порядок вещей следующим образом:
class B{
public:
B(){
}
};
class A{
B b;
};
Редактировать : см. Также этот вопрос , чтобы узнать разницумежду объявлением и определением.
Дальнейшее редактирование : альтернативой может быть изменение данных вашего члена на указатель или ссылку.Обратите внимание, что это не тривиальное изменение синтаксиса: оно влияет на жизненный цикл ваших объектов, поскольку объект, на который указывает A :: b, может затем пережить разрушение A.
Если вы хотитеявляется композиция (B является частью A и умирает с A), использование указателя сделает вашу жизнь сложнее с небольшими преимуществами.
Больше правок (!) : только что понял, что я неправильно прочиталконец вашего вопроса;По каким причинам вы не можете объявить B перед A?
Если их невозможно обойти, возможно, вам придется пойти по указателю.Эти причины могут быть признаком того, что ваши объекты слишком тесно связаны!(возможно, B должен быть внутренним классом A? Или просто быть объединенным в один объект?)