Objekt das sich selber löscht?



  • Hallo Leute,

    hab diese Frage schonmal gestellt, allerding bekam ich kein Antwort, weil ich die Frage vll etwas falsch gestellt habe.

    Also folgendes , ich habe eine Liste std:list welche Obejekte des Types CElem enthält. Jede CElem Objekt bestizt die Referenz zu der Liste, und den Iterator des Listenelemtens wo es selber in der liste sitzt.

    class CElem{
    
    	.
    .
    .
    	std::list<CElem>::iterator itME;
            std::list<CElem> &MyList;
    
    void DeleteMe(){
    
    		MyList->erase(itME); // Hier löscht sichdas Objekt ja selber,  und ab diese stelle ist es nich mehr vorhanden was passiert?
    	}
    .
    .
    .
    };
    

    müsste ich die Methode DeleteME() statisch machen.. oder ist das allgemein ein schlechte design?



  • BorisDieKlinge schrieb:

    hab diese Frage schonmal gestellt, allerding bekam ich kein Antwort, weil ich die Frage vll etwas falsch gestellt habe.

    Deine Problembeschreibung ist auch hier magelhaft...

    BorisDieKlinge schrieb:

    Also folgendes , ich habe eine Liste std:list welche Obejekte des Types CElem enthält. Jede CElem Objekt bestizt die Referenz zu der Liste, und den Iterator des Listenelemtens wo es selber in der liste sitzt.

    Ich tippe auf sehr schlechtes Design:
    1. Listenelemente sollten niemals selbst von der Liste wissen
    2. Iteratoren zu halten sollte man sich auch nicht angewöhnen (selbst wenn es bei den ein oder anderen Container geht)

    BorisDieKlinge schrieb:

    MyList->erase(itME); // Hier löscht sichdas Objekt ja selber,  und ab diese stelle ist es nich mehr vorhanden was passiert?
    

    Hier löscht sich bei einer Liste das Element nicht selber, zumindestens wenn wir von std::list sprechen (Das Löschen geschieht durch die Liste, und die ruft auch den Destruktor auf). Ich frage mich daher eh wozu du überhaupt eine "DeleteME" brauchst?



  • Die funktion DeleteME(); ist ja eine funktion des Objekts das gelöscht wird. Das programm befindset sich ja noch in der funktion nachdem es mit erase gelöscht wurde.. es geht lediglich darum was da passieren würde..

    asc schrieb:

    Iteratoren zu halten sollte man sich auch nicht angewöhnen (selbst wenn es bei den ein oder anderen Container geht)

    naja bei ner liste düfte das kein problem sein mit iteratoren speichern, weil diese sich ja nich verändern wenn von wo anderes aus die Liste verändert werden.



  • BorisDieKlinge schrieb:

    Die funktion DeleteME(); ist ja eine funktion des Objekts das gelöscht wird. Das programm befindset sich ja noch in der funktion nachdem es mit erase gelöscht wurde.. es geht lediglich darum was da passieren würde..

    Ich würde sagen, das kommt daher das man die Logik, die eigentlich Bestandteil der Liste und nicht von Elementen ist, in die Elemente zu verlagern. Mich interessiert warum du dieses Design überhaupt wählst und nicht einfach z.B. zur std::list greifst.

    BorisDieKlinge schrieb:

    naja bei ner liste düfte das kein problem sein mit iteratoren speichern, weil diese sich ja nich verändern wenn von wo anderes aus die Liste verändert werden.

    Nicht desto trotz zeugt es von schlechtem Design was ich bislang auch nur bestätigt sehe. Schau dir doch mal die Implementierungen der Üblichen Listen an, und frag dich ob nicht zufälligerweise eine Absicht hinter dem Design steckt.



  • Man stelle sich vor man hat zwei Objekte A und B. jedes dieser Objekte hat bestizt elemente welceh gleichzeitig in einer gemeinsamen Liste integriert sind.

    Nun will ich Objekt A löschen, und damit auch alle Elemente aus der Liste welche sich zum Objekt A beziehen. Nun könnte ich mir doch einfach alle iteratoren jedes Elemente in Objekt A speichert und damit die Elemente auf einen schlag löschen?



  • BorisDieKlinge schrieb:

    Man stelle sich vor man hat zwei Objekte A und B. jedes dieser Objekte hat bestizt elemente welceh gleichzeitig in einer gemeinsamen Liste integriert sind.

    Gerade wenn es um Ungereimtheiten beim Design geht, sollte man mehr auf die sprachliche Form achten.

    Nun will ich Objekt A löschen, und damit auch alle Elemente aus der Liste welche sich zum Objekt A beziehen.

    Woher kommt nun auf einmal die Rückreferenz auf den Container?

    Nun könnte ich mir doch einfach alle iteratoren jedes Elemente in Objekt A speichert und damit die Elemente auf einen schlag löschen?

    Formulier das Ganze am besten nochmals neu, das ist ein einziges Kauderwelsch.


  • Mod

    BorisDieKlinge schrieb:

    MyList->erase(itME); // Hier löscht sichdas Objekt ja selber,  und ab diese stelle ist es nich mehr vorhanden was passiert?
    

    Das ist im Grunde nur eine Abwandlung von

    delete this;
    

    Anschließend existiert das Objekt nicht mehr, folglich darfst du dich nicht mehr darauf beziehen, insbesondere (aber nicht beschränkt darauf) darf this nicht mehr verwendet werden - der Zugriff auf irgendwelche nicht-statischen Member oder Memberfunktionen (dieses Objekts) ist damit verwehrt. Am Besten verlässt man die Funktion danach nur noch.

    asc schrieb:

    1. Listenelemente sollten niemals selbst von der Liste wissen
    2. Iteratoren zu halten sollte man sich auch nicht angewöhnen (selbst wenn es bei den ein oder anderen Container geht)

    Warum?



  • camper schrieb:

    asc schrieb:

    1. Listenelemente sollten niemals selbst von der Liste wissen
    2. Iteratoren zu halten sollte man sich auch nicht angewöhnen (selbst wenn es bei den ein oder anderen Container geht)

    Warum?

    Weil man sein Design damit unnötig star konstruiert, und Änderungen im Design erschwert. Um so weniger gegenseitige Abhängigkeiten existieren, um so flexibler ist das Design und kann später den Anforderungen angepasst werden.

    cu André



  • class CElem{

    .
    .
    .
    std::list<CElem>::iterator itME;
    std::list<CElem> &MyList;

    void DeleteMe(){

    MyList->erase(itME); // Hier l?scht sichdas Objekt ja selber, und ab diese stelle ist es nich mehr vorhanden was passiert?
    }
    .
    .
    .
    };

    und

    Man stelle sich vor man hat zwei Objekte A und B. jedes dieser Objekte hat bestizt elemente welceh gleichzeitig in einer gemeinsamen Liste integriert sind.
    ...

    stimmen sich nicht überein
    anscheinend du hast direkt Zugriff auf das einzelne Element, was du willst doch durch delete onelist, alle Elemente, die in dieser List gespeichert sind, gelöscht werden, und die auch in einer 3 list löschen.
    quasi:

    1. create A, create B
    2. fill A with data, fill B with data,
    3. integrate A Data to C, integrate B Data to C, 
    4. delete A, C should not still hold the data from A
    

    richtig?

    1. Listenelemente sollten niemals selbst von der Liste wissen

    nicht unbedingt, etwa wie ein blatt hat ein Image drauf, image muss auch wissen er selbt zu welchem Blatt gehört


Anmelden zum Antworten