Перед определением A нужно предварительно объявить class B;. Для хранения указателя достаточно неполного типа, полное определение B в этом месте не требуется.
Объявление взаимосвязанных классов с указателями друг на друга
Перед определением A нужно предварительно объявить class B;. Для хранения указателя достаточно неполного типа, полное определение B в этом месте не требуется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В примере объявлены два класса A и B, каждый из которых хранит указатель на объект другого класса. Приведённый код не компилируется. Требуется указать, в чём ошибка в объявлении класса A, и предложить изменение, после которого программа успешно собирается.
class A {
B* b;
};
class B {
A* a;
};
Ответ
Перед определением A нужно предварительно объявить class B;. Для хранения указателя достаточно неполного типа, полное определение B в этом месте не требуется.
class B;
class A {
B* b = nullptr;
};
class B {
A* a = nullptr;
};
Полное определение B понадобится там, где обращаются к его членам, создают объект B по значению или вычисляют sizeof(B). Поэтому методы A, использующие содержимое B, обычно определяют после объявления обоих классов либо в отдельном .cpp. Взаимное включение заголовков само по себе эту зависимость не решает.