C++ std:: уникальный ptr-возврат из функции и тест для null

у меня есть функция, которая должна возвращать указатель на объект класса myClass. Для этого я использую std::unique_ptr.

если функция выполняется успешно, она возвращает указатель на объект с данными. Если это не удается, он должен вернуться null.

это мой код скелептон:

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 ответов


должно работать любое из следующих действий:

return std::unique_ptr<myClass>{};
return std::unique_ptr<myClass>(nullptr);

чтобы проверить, указывает ли возвращаемый объект на допустимый объект или нет, просто используйте:

if ( returnedData )
{
   // ...
}

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


Да, это возможно. Построенное по умолчанию unique_ptr что требуется:

создает std::unique_ptr это ничего не имеет.

// No data found
return std::unique_ptr<myClass>{};

, что эквивалентно nullptr_t конструктор, так что, возможно, это более ясно:

// No data found
return nullptr;

Да, это возможно. Построенное по умолчанию 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)
    {
        ... 
    }
}

в последней библиотеке C++ должна быть на <memory> что у нас unique_ptr ' s так же легко, как в библиотеке C++11 позволяет с make_shared и общие указатели.

таким образом, вы могли бы немного прояснить код, вернувшись std::make_unique(nullptr)

плюс в следующей версии C++ будет тип "option", который будет оцениваться как some или none значение. The none value не будет рассматриваться как допустимое значение, в отличие от пустого unique_ptr можно рассматривать как nullptr. Тип опции будет представлять собой еще одну часть Boost, входящую в стандартную библиотеку.