クラス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 ?
}
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)不可能な場合、代替手段はありますか?
手伝ってくれてありがとう。
次のいずれかが機能するはずです。
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++ライブラリでは、make_unique
_に_<memory>
_関数があり、C++ 11ライブラリで_unique_ptr
_および共有ポインタを使用して、_make_shared
_を簡単に作成できます。 。
したがって、std::make_unique(nullptr)
を返すことでコードを少し解明できます。
さらに、C++の次のバージョンでは、some
値またはnone
値のいずれかとして評価される「オプション」タイプがあります。空のunique_ptrがnullptrのように扱われる可能性があるのとは異なり、none
値は有効な値として扱われることはできません。オプションタイプは、標準ライブラリに入るBoostのさらに別の部分を表します。