В настоящее время я нахожусь в процессе изучения умных указателей и стараюсь избегать использования сырых указателей.
У меня есть вектор с общими ptrs
std::vector<std::shared_ptr<View>> mChildren;
и метод добавления и удаления
void View::AddChild(std::shared_ptr<View> view) {
mChildren.push_back(view);
}
void View::RemoveChild(std::shared_ptr<View> view) {
auto removal = std::remove(mChildren.begin(), mChildren.end(), view);
mChildren.erase(removal, mChildren.end());
}
Теперь в другой части моего кода у меня есть карта
std::map<std::weak_ptr<ModelGem>,std::unique_ptr<ViewGem>,std::owner_less<std::weak_ptr<ModelGem>>> mViews;
Теперь, когда я пытаюсь удалить элементы с карты следующим образом:
for (auto iterator = mViews.begin(); iterator != mViews.end();)
{
if (iterator->first.expired())
{
RemoveChild(iterator->second.get());
iterator = mViews.erase(iterator);
}
else
{
iterator++;
}
}
Теперь проблема заключается здесь: iterator->second.get()
Он говорит мне, что не может преобразовать значение типа указателя в общий ptr.
Однако, если я использую сырые указатели вместо общих указателей, это вообще не проблема.
Итак, мне интересно, если в этом случае было бы лучше просто использовать сырые указатели или я могу обойти это с общими указателями?
Итак, мне интересно, если в этом случае было бы лучше просто использовать сырые указатели или я могу обойти это с общими указателями?
В большинстве случаев есть только один правильный тип указателя для использования. Это не так, как один лучше, чем другой. Есть только один правильный путь.
Карта содержит unique_ptr<ViewGem>
, Это означает, что он берет на себя полную ответственность и не разделяется с какой-либо другой структурой данных. Таким образом, невозможно иметь один и тот же объект в vector<shared_ptr...>
не вызывая неопределенного поведения. Вы должны решить, у кого ds есть владелец корабля,
unique_ptr
в карте и сырой ptr в вектореunique_ptr
в векторе и сырой ptr на карте.shared_ptr
в обоих.Других решений пока нет …