Достаточно предварительно объявить 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.