2017-08-01 3 views
3

In meinen Vorträgen sehe ich niemanden, der den Destruktor zum Zurücksetzen von Werten auf seine Startparameter verwendet, sondern jede Variable manuell in der Funktion ausführt. Wird für Reseting in einer Klasse-Funktion ein destructor mit/Löschen alle Probleme verursachenIst es in Ordnung, den Destruktor innerhalb der Funktion einer Klasse zu verwenden, um Werte zurückzusetzen?

Kleines Beispiel dafür, was ich meine:

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

'neuer int (NewValue)' wirft 'std :: bad_alloc'. Der Code namens ResetStats fängt ihn ab. Aber irgendwie ist das Objekt Toast und sie können nicht mehr damit arbeiten, auch wenn sie sich erholen können. – StoryTeller

+0

oder [Aufruf destructor ausdrücklich] (https://stackoverflow.com/questions/16720201/calling-destructor-explicitly) –

+2

„In meinen Vorlesungen I-Werte nicht, dass jemand mit dem destructor sehen für Reseting dort Startparameter“ - denn das sind keine Destruktoren, das machen Konstruktoren. –

Antwort

5

eine nicht-triviale destructor Aufruf explizit beendet Objekts Lebensdauer (why?).

Teilen Sie die Funktionalität zwischen ResetStats und destructor, indem sie in einer separaten privaten Funktion setzen:

// 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

Nr Destruktoren ist aufgerufen werden, wenn Objekte zerstört werden, nicht bei dem Versuch, seinen Zustand zurückgesetzt werden.

Um Wert zurückgesetzt ich mit einem Standard-konstruiertes Objekt, oder verschieben Zuordnung zu einem Standard-konstruiertes Objekt einen Swap mit einem Standard-konstruiertes Objekt, Kopieren/Verschieben Bau bevorzugen.

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

Natürlich müsste man eine Swap-Methode, einen Kopierkonstruktor oder eine Zuweisung implementieren. Lookup-Verschiebungssemantik, um diese richtig zu implementieren.

Ein Gedanke, den ich habe, ist, betrachten Klassen, die RAII durchsetzen. In unserem Beispiel erhält test ein Dateihandle in seinem Konstruktor. Wenn Sie den Dekonstruktor zum Zurücksetzen von Werten aufgerufen haben, hat das Objekt beim Versuch, es zurückzusetzen, kein Dateihandle mehr, da es im Konstruktor abgerufen und im Dekonstruktor freigegeben wird.

Dekonstruktoren sollten nur aufgerufen werden, wenn ein Objekt imo zerstört wird.

Verwandte Themen