web-dev-qa-db-de.com

C++ std :: unique_ptr gibt die Funktion zurück und testet auf null

Ich habe eine Funktion, die einen Zeiger auf ein Objekt der Klasse myClass zurückgeben muss. Zu diesem Zweck verwende ich std::unique_ptr.

Wenn die Funktion erfolgreich ist, muss sie einen Zeiger auf ein Objekt mit Daten zurückgeben. Wenn dies fehlschlägt, sollte null zurückgegeben werden.

Dies ist mein 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 ?
}

auf 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
}

Also hier meine Fragen:

a) Ist das (Rückgabe eines Objekts oder null) mit std::unique_ptr möglich?

b) Wenn möglich, wie soll das implementiert werden?

c) Wenn nicht möglich, welche Alternativen gibt es?

Danke fürs Helfen.

15
Mendes

Eine der folgenden Möglichkeiten sollte funktionieren:

return std::unique_ptr<myClass>{};
return std::unique_ptr<myClass>(nullptr);

Um zu testen, ob das zurückgegebene Objekt auf ein gültiges Objekt verweist, verwenden Sie einfach:

if ( returnedData )
{
   // ...
}

Siehe http://en.cppreference.com/w/cpp/memory/unique_ptr/operator_bool .

26
R Sahu

Ja es ist möglich. Ein standardmäßig konstruierter unique_ptr ist das, was Sie wollen:

Konstruiert einen std::unique_ptr, der nichts besitzt. 

// No data found
return std::unique_ptr<myClass>{};

Das ist äquivalent zum nullptr_t-Konstruktor, vielleicht ist dies klarer:

// No data found
return nullptr;
7
Barry

Ja, es ist möglich. Ein standardmäßig konstruierter unique_ptr oder ein aus nullptr konstruierter Wert kann als null betrachtet werden:

std::unique_ptr<MyClass> getData()
{
    if (dataExists)
        return std::make_unique<MyClass>();
    return nullptr;
}

Um auf null zu testen, vergleichen Sie entweder mit nullptr oder nutzen Sie die Konvertierung in bool:

int main()
{
    std::unique_ptr<MyClass> returnedData = getData();

    if (returnedData)
    {
        ... 
    }
}
3
Chris Drew

In der neuesten C++ - Bibliothek sollte eine make_unique-Funktion in <memory> vorhanden sein, die es uns ermöglicht, unique_ptrs so einfach zu erstellen, wie es die C++ 11-Bibliothek mit make_shared und gemeinsam genutzten Zeigern zulässt. 

So können Sie den Code ein wenig erklären, indem Sie std::make_unique(nullptr) zurückgeben.

In der nächsten Version von C++ wird es einen "Option" -Typ geben, der entweder als some-Wert oder als none-Wert ausgewertet wird. Der none-Wert darf nicht so behandelt werden, als wäre er ein gültiger Wert. Anders als der leere unique_ptr könnte er wie ein Nullptr behandelt werden. Der Optionstyp repräsentiert einen weiteren Teil von Boost, der in die Standardbibliothek aufgenommen wird.

1