2017-08-07 7 views
1

C++にはこのコードのスマートポインタと同等のコード化がありますか? External.cppでスマートポインタ相当

:Another.cppで

class ExampleClass {...}; 

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

私は2つ、実際に、あなたがunique_ptrをいずれかを使用することができますがありますか?:

ExampleClass *ptr2 = function(); 
+3

[こちら](https://stackoverflow.com/questions/28294620/what-is-the-best-smart-pointer-return-type-for-a-factory-function)をご覧ください。あなたが提供したコードは、工場の機能のようです。 –

答えて

5

、適切にこのような何かをしたいと思いますまたはshared_ptrを使用する場合はこちらを参照してください。Which kind of pointer do I use when?

私は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(); 

スマートポインタとはるかに厳密な所有権セマンティクスは本当に最良のアプローチです。