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, входящую в стандартную библиотеку.