我有一个遗留程序,它使用std :: stack对象来存储一些指针。
std::stack<Widget*> widgetStack;
现在我想将其更改为新的C ++ 11样式
std::stack<std::unique_ptr<Widget>> widgetStack;
但是在代码中有一个函数:
Widget* getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top();
}
return null;
}
我正在努力让这个函数与unique_ptr一起工作。堆栈是小部件的所有者,只有在弹出堆栈时,才应销毁Widget对象。关于如何解决这个问题的任何想法?
答案 0 :(得分:6)
如果堆栈是指针的唯一所有者,那么建议返回原始指针,因为原始指针意味着&#34;没有所有权的指针&#34;:
Widget* getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top().get();
}
return nullptr;
}
答案 1 :(得分:2)
我个人不喜欢使用原始指针。您可以按照@ user202729
的建议,将std::unique_ptr
更改为std::shared_ptr
std::stack<std::shared_ptr<Widget>> widgetStack;
std::shared_ptr<Widget> getLastWidget()
{
if(!widgetStack.isEmpty())
{
return widgetStack.top();
}
return nullptr;
}
这样指针仍由堆栈管理,您不必以原始形式处理它们。
我在评论中提出了参考,但这不是太好的解决方案。返回引用使得很难返回空堆栈的指示(如示例中的nullptr
)。