我有一个函数需要返回指向类myClass
的对象的指针。为此,我使用std::unique_ptr
。
如果函数成功,它将返回一个指向带有数据的对象的指针。如果失败,则应返回null
。
这是我的代码skelepton:
std::unique_ptr<myClass> getData()
{
if (dataExists)
... create a new myClass object, populate and return it ...
// No data found
return std::unique_ptr<myClass> (null); <--- Possible ?
}
on main
:
main()
{
std::unique_ptr<myClass> returnedData;
returnedData = getData();
if (returnedData != null) <-- How to test for null ?
{
cout << "No data returned." << endl;
return 0;
}
// Process data
}
所以这是我的问题:
a)是否可以使用null
完成(返回对象或std::unique_ptr
)?
b)如果可能,如何实施?
c)如果不可能,有什么替代方案?
感谢您的帮助。
答案 0 :(得分:29)
以下任何一种都应该有效:
return std::unique_ptr<myClass>{};
return std::unique_ptr<myClass>(nullptr);
要测试返回的对象是否指向有效对象,只需使用:
if ( returnedData )
{
// ...
}
请参阅http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool。
答案 1 :(得分:7)
是的,这是可能的。默认构造的unique_ptr
是您想要的:
构造一个不拥有任何东西的
std::unique_ptr
。
// No data found
return std::unique_ptr<myClass>{};
这相当于nullptr_t
构造函数,所以这可能更清楚:
// No data found
return nullptr;
答案 2 :(得分:4)
是的,有可能。默认构造的unique_ptr
或由nullptr
构造的默认值可以视为null:
std::unique_ptr<MyClass> getData()
{
if (dataExists)
return std::make_unique<MyClass>();
return nullptr;
}
要测试null,请与nullptr
进行比较或利用转换为bool:
int main()
{
std::unique_ptr<MyClass> returnedData = getData();
if (returnedData)
{
...
}
}
答案 3 :(得分:1)
在最新的C ++库中,make_unique
中应该有一个<memory>
函数,允许我们像在C ++ 11库中一样轻松地生成unique_ptr
make_shared
和共享指针。
因此,您可以通过返回std::make_unique(nullptr)
在下一版本的C ++中,将会有一个“选项”类型,它将评估为some
值或none
值。 none
值不会被视为有效值,不像空的unique_ptr可以被视为nullptr。选项类型将代表另一段Boost进入标准库。