Объявление взаимосвязанных классов с указателями друг на друга

Перед определением 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. Взаимное включение заголовков само по себе эту зависимость не решает.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее