У меня есть два класса. В иллюстративных целях я использую идею меню и пунктов меню
class Menu {
public:
...
RemoveItem(Item* item) {
// Remove appropriate item from menu_items vector
};
private:
std::vector<std::shared_ptr<Item>> menu_items;
}
class Item {
public:
Item(Menu* owner) : menu{owner} {}
~Item() { RemoveThisMenuItem() }
void RemoveThisMenuItem() {
for (const auto& ingredient : ingredients) {
ingredient.SetNecessary(false);
}
menu.RemoveItem(this);
}
...
private:
Menu* menu;
std::vector<Ingredients*> ingredients;
...
}
По сути, у меня есть класс Item
, который принадлежит классу Menu
(и, возможно, где-то на него ссылаются shared_ptr
с). Теперь я хочу удалить предмет. Когда Элемент удален, он должен сначала выполнить некоторые другие функции (например, пометить все ненужные ингредиенты), а затем удалить его из Menu
.
То, как все реализовано сейчас, есть странный цикл, когда мы хотим удалить элемент, так как вызов Item::RemoveThisMenuItem()
вызывает функцию в Menu
, которая удаляет умный указатель на Item
, который вызывает деструктор ~Item()
, который затем вызывает Item::RemoveThisMenuItem()
. Какой лучший способ обойти это?