2017-08-01 4 views
3

私の講義では、関数内のすべての変数を手動で実行する代わりに、値をリセットするためにデストラクタを使用する人はいません。非自明なデストラクタを明示的にオブジェクトの寿命(why?)を終了呼び出すクラスの関数内でデストラクタを使用して値をリセットすることはできますか?

class Test1{ 
     private: 
      int *test; 
      bool valid; 
     public: 
     Test1(int value,bool valid=false){ 
      test=new int(value); this->valid=valid; 
     } 
     ~Test1(){ 
      delete test; test=nullptr; valid=false; 
     } 

    void ResetStats(int NewValue){ 
     this->~Test1(); 
     test1=new int(NewValue); 
     valid=false; 
    } 

    } 
+0

'new int(NewValue)'は 'std :: bad_alloc'をスローします。 'ResetStats'というコードがそれをキャッチします。しかし、どういうわけか、オブジェクトはトーストであり、回復することができても、もはやそれで動作できません。 – StoryTeller

+0

または[デストラクタを明示的に呼び出す](https://stackoverflow.com/questions/16720201/calling-destructor-explicitly) –

+2

「私の講義では、パラメータを開始値にリセットするためにデストラクタを使用する人はいません。それはデストラクタが行うことではなく、コンストラクタが行うことです。 –

答えて

5

:すべての問題に私が何を意味するかの

小さな例を起こし削除/ resetingのクラスの関数でデストラクタを使用します。

シェア別々のプライベート関数でそれを置くことによってResetStatsとデストラクタ間の機能:

// Both destructor and ResetStats call Reset 
~Test1(){ 
    Reset(nullptr); 
} 
void ResetStats(int NewValue) { 
    Reset(new int(NewValue)); 
} 
// Shared functionality goes here 
private Reset(int *ptr) { 
    delete test; 
    test=ptr; 
    valid=false; 
} 
1

号デストラクタは、その状態をリセットしようとすると、オブジェクトではなく、破壊されたときに呼び出されます。

値をリセットするには、既定の構成オブジェクトでスワップするか、既定の構成オブジェクトで構成をコピー/移動するか、既定の構成オブジェクトに割り当てを移動することをお勧めします。

Test1 test; 
// Do stuff 
test.swap(Test()); 

もちろん、スワップメソッド、コピーコンストラクタ、または割り当てを実装する必要があります。これらを適切に実装するためにLookup Moveのセマンティクス。

私が考えていることは、RAIIを強制するクラスを考えてみることです。この例では、testはコンストラクタでファイルハンドルを取得します。値をリセットする目的でデコンストラクタを呼び出した場合、コンストラクタで取得されてデコンストラクタで解放されるため、オブジェクトはリセットしようとしたときにファイルハンドルを持たなくなります。

Deconstructorsは、オブジェクトが破壊されたときにのみ呼び出される必要があります。

関連する問題