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