我有以下代码:
class Thing
{};
void fnc(Thing** out)
{
*out = new Thing();
};
fnc
通过输出参数返回Thing
的新实例。通常我会按如下方式使用它:
int main()
{
Thing* thing;
fnc(&thing);
}
我可以将返回的对象放在std::unique_ptr
中吗?
int main()
{
std::unique_ptr<Thing> uniqueThing;
fnc(???);
}
答案 0 :(得分:5)
要扩展代码示例,它(即按指针传递)将是
void fnc(std::unique_ptr<Thing>* out)
{
out->reset(new Thing());
};
int main()
{
std::unique_ptr<Thing> uniqueThing;
fnc(&uniqueThing);
}
或使用pass-by-reference:
void fnc(std::unique_ptr<Thing>& out)
{
out.reset(new Thing());
};
int main()
{
std::unique_ptr<Thing> uniqueThing;
fnc(uniqueThing);
}
但我认为通过返回值返回指针会更清楚:
std::unique_ptr<Thing> fnc()
{
return std::unique_ptr<Thing>(new Thing);
// or
// return std::make_unique<Thing>();
};
int main()
{
auto uniqueThing = fnc();
}
答案 1 :(得分:2)
你不能直接这样做。您必须使用临时变量:
Thing* thing{};
fnc(&thing);
uniqueThing.reset(*thing);
甚至更好,因为fnc
没有返回错误代码或其他内容,您只需返回新指针即可直接写入uniqueThing
:
std::unique_ptr<Thing> uniqueThing{fnc()};
答案 2 :(得分:2)
您应该将原始指针存储在unique_ptr
中,以便unique_ptr
获得所有权:
Thing* thing;
fnc(&thing);
std::unique_ptr<Thing> thing_unique (thing);
答案 3 :(得分:0)
您需要先从fnc
获取指针,然后创建unique_ptr
,例如:
Thing* tmp;
find(&tmp);
std::unique_ptr<Thing> thing(tmp);