C++ std :: unique_ptr从函数返回并测试为null

Men*_*des 23 c++ unique-ptr c++11

我有一个函数需要返回一个指向类对象的指针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 ?
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

所以这里是我的问题:

a)是否null可以使用std::unique_ptr?(返回一个对象或)?

b)如果可能,如何实施?

c)如果不可能,有哪些替代方案?

谢谢你的帮助.

R S*_*ahu 37

以下任何一种都应该有效:

return std::unique_ptr<myClass>{};
return std::unique_ptr<myClass>(nullptr);
Run Code Online (Sandbox Code Playgroud)

要测试返回的对象是否指向有效对象,只需使用:

if ( returnedData )
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool.

  • 测试结果会像 `if (returnedData != std::nullptr)` 吗? (4认同)
  • 只需`return nullptr;`也可以. (4认同)

Bar*_*rry 8

是的,这是可能的.默认构造unique_ptr是您想要的:

构造一个std::unique_ptr什么都不拥有的东西.

// No data found
return std::unique_ptr<myClass>{};
Run Code Online (Sandbox Code Playgroud)

这相当于nullptr_t构造函数,所以这可能更清楚:

// No data found
return nullptr;
Run Code Online (Sandbox Code Playgroud)


Chr*_*rew 6

对的,这是可能的。一个默认构造unique_ptr或一个构造自nullptr可以被认为是空的:

std::unique_ptr<MyClass> getData()
{
    if (dataExists)
        return std::make_unique<MyClass>();
    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

要测试 null 要么比较要么nullptr利用转换为 bool:

int main()
{
    std::unique_ptr<MyClass> returnedData = getData();

    if (returnedData)
    {
        ... 
    }
}
Run Code Online (Sandbox Code Playgroud)