web-dev-qa-db-fra.com

C++ std :: unique_ptr retourne une fonction et teste null

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.

15
Mendes

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 .

26
R Sahu

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;
7
Barry

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)
    {
        ... 
    }
}
3
Chris Drew

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.

1
cardiff space man