Очистка указателей, не владеющих объектом, после уничтожения объекта ⇐ C++
-
Гость
Очистка указателей, не владеющих объектом, после уничтожения объекта
Обычно я обнаруживаю, что этот фрагмент проникает в мой код, где два объекта, которые не владеют друг другом, должны иметь указатель друг на друга, и этот указатель должен быть «очищен» после уничтожения одного из них следующим образом.
р>
структурная панель; структура Фу; структура foo { бар* bar_item = nullptr; ~фу(); }; структурная панель { foo* foo_item = nullptr; ~бар() { если (foo_item) { foo_item->bar_item = nullptr; } } }; фу::~фу() { если (бар_элемент) { bar_item->foo_item = nullptr; } } интервал основной() { фу объект1; бар объект2; obj1.bar_item = &obj2; obj2.foo_item = &obj1; } Проблема в том, что мне тоже нужно это сделать
[*]удалить конструктор/назначение копирования и реализовать конструктор/назначение перемещения (много шаблонного шаблона, ожидайте не менее 5 членов в каждом классе) [*]преобразуйте все объекты в общий_ptr, и объекты будут иметь слабый_ptr по отношению друг к другу. (возможно, это не всегда осуществимо, поскольку я не могу владеть временем жизни объектов, что также заставляет меня использовать кучу)
Есть ли способ избежать этого? упростить? иметь оболочку RAII для конкретного члена, чтобы избежать реализации операций копирования/перемещения?
простой пример, с которым я когда-то столкнулся, — это графическая система, где мне нужна линия, соединяющая две сферы, линия должна иметь указатели на обе сферы, а сферы должны иметь указатель на линию, все они принадлежат "сцена", но запрос "сцены" о них требует длительного поиска, указатели избегают этого поиска.
Обычно я обнаруживаю, что этот фрагмент проникает в мой код, где два объекта, которые не владеют друг другом, должны иметь указатель друг на друга, и этот указатель должен быть «очищен» после уничтожения одного из них следующим образом.
р>
структурная панель; структура Фу; структура foo { бар* bar_item = nullptr; ~фу(); }; структурная панель { foo* foo_item = nullptr; ~бар() { если (foo_item) { foo_item->bar_item = nullptr; } } }; фу::~фу() { если (бар_элемент) { bar_item->foo_item = nullptr; } } интервал основной() { фу объект1; бар объект2; obj1.bar_item = &obj2; obj2.foo_item = &obj1; } Проблема в том, что мне тоже нужно это сделать
[*]удалить конструктор/назначение копирования и реализовать конструктор/назначение перемещения (много шаблонного шаблона, ожидайте не менее 5 членов в каждом классе) [*]преобразуйте все объекты в общий_ptr, и объекты будут иметь слабый_ptr по отношению друг к другу. (возможно, это не всегда осуществимо, поскольку я не могу владеть временем жизни объектов, что также заставляет меня использовать кучу)
Есть ли способ избежать этого? упростить? иметь оболочку RAII для конкретного члена, чтобы избежать реализации операций копирования/перемещения?
простой пример, с которым я когда-то столкнулся, — это графическая система, где мне нужна линия, соединяющая две сферы, линия должна иметь указатели на обе сферы, а сферы должны иметь указатель на линию, все они принадлежат "сцена", но запрос "сцены" о них требует длительного поиска, указатели избегают этого поиска.
Мобильная версия