2016-06-01 4 views
3

一時ファイルを表すクラスがあります。私は、関数からこれを返す場合は大雑把に、それはそれはコピーが作られ、および削除元であろうというのが私の理解ですので、私はもうファイルを持っていないだろう、このC++で有効なデータのコピーを1つだけ適用します

class TempFile { 
private: 
    std::string mName; 
public: 
    TempFile() : 
     mName(std::tmpnam(NULL)) {} 
    ~TempFile() { 
     //File automatically deleted when this goes out of scope 
     std::remove(mName.c_str()); 
    } 
}; 

のように見えます。

私はヒープ割り当てしてポインタを返すことができましたが、私は非常に強く、生ポインタなしのソリューションを好んでいます。私はブーストまたはC++を許可されていません11。これは動作するはず

TempFile(TempFile& rhs) { 
    mName = rhs.mName; 
    rhs.mName = ""; 
} 

が、それは悪だと、ほぼ確実に、後で問題が発生します。

私の最高のアイデアは、誤解を招くようなコピーコンストラクタを定義することです。

+2

あなたはlighweightの独自のバージョン[ 'のstd :: shared_ptr'](http://en.cppreference.com/w/を書くことができますcpp/memory/shared_ptr)。 –

+1

コピーctorと代入演算子をprivateにします。 –

答えて

2

C++ 11を使用できない場合はstd::auto_ptrを使用します。これは廃止されました。あなたの会社がC++ 11を使い始めると、廃止予定の警告が表示されます。ソリューションは、独自の共有PTRを書くことになります:

http://coliru.stacked-crooked.com/a/77c9a0f2e0e3d42f

#include <memory> 

struct X{ 

    ~X() { 
    std::cout << "~X"; 
    } 
}; 

std::auto_ptr<X> foo() { 
    std::auto_ptr<X> px(new X); 
    return px; 
} 

int main() 
{ 
    std::auto_ptr<X> px = foo(); 
} 
関連する問題