Взаимосвязанные классы с взаимными указателями

Достаточно предварительно объявить B перед A: для хранения указателя полный тип не нужен. Определения методов, обращающихся к членам другого класса, размещают после полного определения обоих типов.

Короткий ответ

Что ответить на собеседовании

Достаточно предварительно объявить B перед A: для хранения указателя полный тип не нужен. Определения методов, обращающихся к членам другого класса, размещают после полного определения обоих типов.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо создать два класса, каждый из которых содержит указатель на объект другого класса. При этом следует правильно оформить объявление таких классов, учитывая требования компилятора, в частности необходимость предварительного (forward) объявления.

class A {
    // указатель на B
};

class B {
    // указатель на A
};

Ответ

Достаточно предварительно объявить B перед A: для хранения указателя полный тип не нужен. Определения методов, обращающихся к членам другого класса, размещают после полного определения обоих типов.

class B;

class A {
public:
    B* peer = nullptr;
};

class B {
public:
    A* peer = nullptr;
};

Такие указатели сами ничего не удаляют. Нужно отдельно определить владельца объектов и не оставлять dangling pointer после уничтожения одного из них. Если используется совместное владение, взаимные shared_ptr могут создать цикл; для обратной невладеющей связи обычно нужен weak_ptr.

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

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

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

Подробнее