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

时间:2015-05-17 23:53:54

标签: c++ c++11 unique-ptr

我有一个函数需要返回指向类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)如果不可能,有什么替代方案?

感谢您的帮助。

4 个答案:

答案 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进入标准库。