J'ai une fonction qui doit renvoyer un pointeur sur un objet de la classe myClass
. Pour cela, j'utilise std::unique_ptr
.
Si la fonction réussit, elle renverra un pointeur sur un objet avec des données. Si cela échoue, il devrait renvoyer null
.
Ceci est mon code 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 ?
}
sur 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
}
Alors voici mes questions:
a) Est-ce possible (retourner un objet ou null
) en utilisant std::unique_ptr
?
b) Si possible, comment implémenter?
c) Si non possible, quelles sont les alternatives?
Merci pour ton aide.
L’une des opérations suivantes devrait fonctionner:
return std::unique_ptr<myClass>{};
return std::unique_ptr<myClass>(nullptr);
Pour tester si l'objet renvoyé pointe sur un objet valide ou non, utilisez simplement:
if ( returnedData )
{
// ...
}
Voir http://fr.cppreference.com/w/cpp/memory/unique_ptr/operator_bool .
Oui c'est possible. Un unique_ptr
construit par défaut est ce que vous voulez:
Construit un
std::unique_ptr
qui ne possède rien.
// No data found
return std::unique_ptr<myClass>{};
Cela équivaut au constructeur nullptr_t
, alors c'est peut-être plus clair:
// No data found
return nullptr;
Oui c'est possible. Un unique_ptr
construit par défaut ou un construit à partir de nullptr
peut être considéré comme nul:
std::unique_ptr<MyClass> getData()
{
if (dataExists)
return std::make_unique<MyClass>();
return nullptr;
}
Pour tester la valeur null, comparez nullptr
ou profitez de la conversion en bool:
int main()
{
std::unique_ptr<MyClass> returnedData = getData();
if (returnedData)
{
...
}
}
Dans la dernière bibliothèque C++, il devrait y avoir une fonction make_unique
dans <memory>
nous permettant de créer des unique_ptr
aussi facilement que dans la bibliothèque C++ 11 permet avec make_shared
et des pointeurs partagés.
Ainsi, vous pourriez élucider un peu le code en retournant std::make_unique(nullptr)
De plus, dans la prochaine version de C++, il y aura un type "option" qui sera évalué en tant que valeur some
ou none
. La valeur none
ne sera pas autorisée à être traitée comme si elle était une valeur valide, contrairement au nom unique unique_ptr qui pourrait être traité comme un nullptr. Le type d'option représentera encore un autre morceau de Boost entrant dans la bibliothèque standard.