2017-08-07 4 views
1

Es gibt eine äquivalente Kodierung in C++ mit Smartpointern für diesen Code?Smartpointers gleichwertig

In External.cpp:

class ExampleClass {...}; 

ExampleClass* function() 
{ 
    ExampleClass *ptr = new ExampleClass(); 
    ptr->doSomething(); 
    return ptr; 
} 

In Another.cpp würde ich so etwas wie dies richtig tun, wie ?:

ExampleClass *ptr2 = function(); 
+3

Werfen Sie einen Blick [hier] (https://stackoverflow.com/questions/28294620/what-is-the-best-smart-pointer-return-type-for-a-factory-function). Der von Ihnen bereitgestellte Code scheint eine Factory-Funktion zu sein. –

Antwort

5

Es gibt zwei tatsächlich, können Sie entweder unique_ptr verwenden oder shared_ptr, schauen Sie hier, wenn zu verwenden, die: Which kind of pointer do I use when?

I'f Sie für die unique_ptr entscheiden würde, dann würden Sie erhalten:

class ExampleClass {...}; 

std::unique_ptr<ExampleClass> function() 
{ 
    std::unique_ptr<ExampleClass> uptr = std::make_unique<ExampleClass>(); 
    uptr->doSomething(); 
    return std::move(uptr); 
} 

//In Another.cpp 
std::unique_ptr<ExampleClass> ptr2 = function(); 
//you could even store the result in a shared pointer!! 
std::shared_ptr<ExampleClass> ptr3 = function(); 
1

Ich werde es nicht wirklich empfehlen, aber Sie können ein Objekt zurückgeben, das implizit in einen rohen Zeiger konvertiert. Es wird es für eine kurze Dauer besitzen und löschen, wenn niemand es ergreift.

struct RelinquishOrDelete { 
    ExampleClass *_ptr; 

    operator ExampleClass*() { auto ret = _ptr; _ptr = nullptr; return ret; } 

    ~RelinquishOrDelete() { 
    if(!_ptr) { 
     cerr << "returned object wasn't taken by a new owner\n"; 
     delete _ptr; 
    } 
    } 
}; 

Die Verwendung ist einfach. Es wird den Zeiger in diesem einfachen Fall packen und entpacken:

RelinquishOrDelete function() 
{ 
    ExampleClass *ptr = new ExampleClass(); 
    ptr->doSomething(); 
    return {ptr}; 
} 

// ... 

ExampleClass *ptr2 = function(); 

Aber natürlich wird es wahrscheinlich zu unerwartetem Verhalten führen, wenn in diesem absolut vernünftig Stück Code verwendet:

auto ptr3 = function(); 

Ein Smart-Pointer mit viel strengere Besitz Semantik ist wirklich der beste Ansatz.