Destruktor automatisch nach Konstruktor



  • Hallo zusammen!
    Ich habe ein Problem bei einer Klasse. Da der Code sehr lang und unüberschaubar ist, werde ich mit Pseudo-Code das Problem darstellen.

    class Klasse
    {
        Klasse() {};
        Klasse(int test);
        ~Klasse() { Clean(); };
    
        Create(int test) { Klasse(test); }:
        Clean();
    
        int Use() {return test;};
    }
    

    Nun erfolgt dieser Aufruf:

    Klasse test;  //Standard-Konstruktor
    test.Create(15);    //Klassenvariable erzeugt
    test.Use();    //Hier wird auf Klassenvariable zugegriffen
    

    Im Konstruktor wird eine bestimmte Klassenvariable initialisiert. Diese wird dann auch im Destruktor bzw in Clean() wieder gelöscht.
    Das Problem hierbei ist, dass, wenn ich im Debugger die Ausführung verfolge, dass nach der 2ten Zeile (test.Create(int)), in der der Konstruktor (manuell) aufgerufen wird, danach der Destruktor aufgerufen wird und mir die soeben initialisierte Klassenvariable wieder löscht. Daher bekomme ich dann beim Zugriff darauf Fehlermeldungen.

    Wie kommt dieses Verhalten zustande und was kann ich dagegen tun?


  • Mod

    Das Verhalten ist doch genau das was du da machst: In create wird ein neues, namenloses Klassenobjekt angelegt und beim Verlassen der Funktion wieder zerstört wie es auch sein muss. Dein use funktioniert nicht, weil deine Klasse gar kein Member namens test hat.

    Da das ganze aber überhaupt keinen Sinn macht, nehme ich mal an, dass dies nicht das ist was du wolltest.



  • SeppJ schrieb:

    Das Verhalten ist doch genau das was du da machst: In create wird ein neues, namenloses Klassenobjekt angelegt und beim Verlassen der Funktion wieder zerstört wie es auch sein muss. Dein use funktioniert nicht, weil deine Klasse gar kein Member namens test hat.

    Da das ganze aber überhaupt keinen Sinn macht, nehme ich mal an, dass dies nicht das ist was du wolltest.

    Der Sinn hinter dem markierten ist aber, den Konstruktor aufzurufen. Kann ich denn überhaupt den Konstruktor aus einer Methode aufrufen??

    Hintergrund: Diese Klasse soll später auch z.b. durch ein Array korrekt initialisiert werden können. Da man bei Arrays aber nur den Standard-Konstruktor hat (der aufgerufen wird), muss für alle Elemente die Create()-Funktion aufgerufen werden. Und eben diese funktioniert hier nicht...



  • Du kannst ein Objekt das schon konstruiert ist nicht einfach nochmal konstruieren.
    Verwende den Zuweisungsoperator dafür:

    class Klasse
    {
    public:
        Klasse() : m_test(0) {};
        Klasse(int test) : m_test(test) {};
    
        int Use() {return m_test;}
    
    private:
        int m_test;
    };
    
    int main()
    {
       Klasse k;
       k = Klasse(123);
       std::cout << k.Use() << std::endl;
    }
    


  • Hierbei habe ich wieder das Problem, dass der Destruktor aufgerufen wird 😮 :

    int main()
    {
       Klasse k;
       k = Klasse(123);  //Aufruf Kontruktor, Aufruf Destruktor
       std::cout << k.Use() << std::endl;  //Zugriffsfehler
    }
    


  • Dass der Destruktor hier aufgerufen wird ist normal und richtig.

    doubleNULL schrieb:

    int main()
    {
       Klasse k;
       k = Klasse(123);  //Aufruf Kontruktor, Aufruf Destruktor
       std::cout << k.Use() << std::endl;  //Zugriffsfehler
    }
    

    Der "Zugriffsfehler" kommt vermutlich einfach daher, dass du deiner Klasse keinen passenden Copy-Konstruktor und Assignment-Operator verpasst hast.
    Bei einer Klasse die einfach nur ein Integer als Member hat, ist das auch nicht nötig. Wenn die Klasse aber "manuell" irgendwelche Resourcen kontrolliert, dann musst du das machen.

    Also wenn du ein "new" im Konstruktor hast, dann brauchst du auch ein "delete" im Destruktor, und musst normalerweise auch den Copy-Konstruktor und Assignment-Operator selbst implementieren.

    http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)

    Ich glaube aber dass dir einfach einige C++ Grundlagen fehlen, wie z.B. was Objekte in C++ überhaupt sind, wie sich diese verhalten, welche Rolle Konstruktor und Destruktor bei der Erzeugung/Zerstörung von Objekten spielen etc.



  • Ok, danke für den Link! Das Problem bestand darin, dass ich versucht habe, einen Zeiger zu kopieren, der auf eine "leere" Speicherstelle zeigte 🙄
    Ich danke allen für ihre Bereitschaft!


Anmelden zum Antworten