2017-08-07 58 views
1

C++中有與智能指針相同的代碼代碼?相當於智能指標

在External.cpp:

class ExampleClass {...}; 

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

在Another.cpp我想這樣做正確,?:

ExampleClass *ptr2 = function(); 
+3

看一看[這裏](https://stackoverflow.com/questions/28294620/what-is-the-best-smart-pointer-return-type-for-a-factory-function)。您提供的代碼似乎是工廠功能。 –

回答

5

有多麼兩個實際上,你可以使用任何的unique_ptr或shared_ptr的,看看這裏時所使用的:Which kind of pointer do I use when?

I'f你選擇的的unique_ptr,那麼你會得到:

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

我不會真的推薦它,但你可以返回一個隱式轉換爲原始指針的對象。它將擁有它很短的時間,並刪除如果沒有人抓住它。

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

使用它很簡單。這將打包和解包的指針在這個簡單的例子:

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

// ... 

ExampleClass *ptr2 = function(); 

不過,當然,如果在這個完全合理的一段代碼中使用它可能會導致意外的行爲:

auto ptr3 = function(); 

智能指針與更嚴格的所有權語義確實是最好的方法。