【发布时间】:2018-10-21 14:41:37
【问题描述】:
我目前正在学习智能指针,并尽量避免使用原始指针。
我有一个带有共享 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。
但是,如果我使用原始指针而不是共享指针,这根本不是问题。
所以,我想知道在这种情况下,最好只使用原始指针还是使用共享指针来解决这个问题?
【问题讨论】:
-
View::RemoveChild是否声称拥有view的所有权? -
我不知道
-
所以,它不应该采用智能指针。有趣的阅读:smart-pointer-parameters/.
-
好的,谢谢 我会读这个
-
ViewGem和View是什么关系?
标签: c++ vector shared-ptr stdmap raw-pointer