Object Trees



  • Hi,
    Also mein QT programm stürtzt immer mal wieder ab, je nach dem wie ich die this pointer übergebe. Ist es icht so, dass ein baum aufgebaut wird, und die zerstörund ger opbjekte dann von unten nachoben (bezüglich der Blätter) stadt findet ??.
    Ich in irgendwann dazu über gegangen, die this pointer garnicht mehr zu übergeben, sondern jedes objekt wenn möglich mit dem Standard this pointer zu initialisieren.
    Wo finde ich denn gute beispiele, welche mir die Sache etwas näher bringen.
    Gruß



  • "Je nach dem wie ich die this-pointer übergebe"
    Wie übergibst du die denn? Und an was? Und wann?
    Deine Baumstruktur ist uns auch nicht bekannt...

    Prinzipiell übergibst du den this-pointer ja nur an childs. Und auch nur dann, wenn es wichtig ist dass children direkten Zugriff auf das parent brauchen, z.B. weil es für dich notwendig ist den Weg zur Wurzel von einer bestimmten Node aus erstellen zu können.
    Die children rühren den parent nicht an! Wenn du von einem Kind-Element aus das parent löschst bist du echt selber schuld 😃

    Also prinzipiell schaut das so aus:

    Node:
        ~this:
            for child in children: deleteChild(child)
        deleteChild(child):
            children.remove(child)
            delete child
    

    Das parent wird niemals nicht gelöscht! Die Kinder beim zerstören einer Node aber schon.



  • Okay,

    🙂 Also das ich selber schuld bin das hoffe ich, sonst wäre mir ja meine Handlungsgrundlage entzogen*ggg*.

    Ja so habeich es jetzt auch gemacht. Also nur dann die Pointer an die Kinder weiter geben, wennich den Weg zur Wurzel brauche.

    Dadurch das für mich vieles neu ist, bin ich bei jedem erstellten objekt davon ausgegangen, dass es nur aufgeräumtwird, wenn ich die pointer richtig setze.

    Also einen Objekt mit nicht übergebenem Vater müßte ich dann selbst aufräumen oder irgenso habe chmir das vorgestellt.

    Interessant ist aber, dass ich bei den QActions den Vater angeben muß.
    Wiso kann ich denn da nicht einfach keinen übergeben ???
    In meinem Fall habe ich die Wurzel als Vater angegeben.

    Gruß und Danke



  • AlexXXx schrieb:

    Interessant ist aber, dass ich bei den QActions den Vater angeben muß.
    Wiso kann ich denn da nicht einfach keinen übergeben ???
    In meinem Fall habe ich die Wurzel als Vater angegeben.

    Du hast in deinem Ausgangspost mit keinem Wort erwähnt, dass es um QObjects geht! Sowas solltest du schon sagen :p

    Warum du deinen parent bei QAction nicht weglassen kannst, sagt dir die Doku. Es gibt keinen passenden Konstruktor :p Ein parent ist also notwendig.

    QObject hat eine "doofe" angewohnheit. Wird ein Objekt gelöscht, reißt es ohne zu überlegen alle children mit in den Tod. Das hat folgende Auswirkungen:
    😉 Wenn du in einem anderen Objekt einen Zeiger auf ein automatisch zerstörtes Kind-QObject hast und dieses selber nochmal löschen willst und dieses nicht 0 ist, crasht dein Programm
    😉 Wenn du ein Objekt nicht als pointer anlegst (automatischer Speicherbereich, STACK) und dieses in einem an ein parent anhängst, das parent gelöscht wird und dein Objekt am Ende den Scope verlässt, crasht dein Programm.

    Also ein besonders wachsames Auge ist gefordert.
    Und als "goldene Regel: QObjects die nicht direkt in main() instanziiert werden und/oder einen parent haben niemals auf dem Stack anlegen, sondern immer brav mit new 😃
    (Ich denke genau hier liegt dein aktuelles Problem).
    Sollte das nicht zutreffen wäre es jetzt an der Zeit Code zu posten.



  • Okay,
    Also ich bin davon aus gegangen, dass man in der Qt das Projekt überschaubar hält, in dem man es in lauter kleine von QWidget abgeleitete klassen zerlegt.

    Zumides mach ich das jetzt so. Was Du geschrieben hast ist super, und hilft ir weiter.
    Die QActions schaue ich mir nochmals an. Habs mal kurtz überflogen, aber war einfach zu schnell und habe deswege auch nichts gefunden.



  • Okay QAction ist von QObject abgeleitet. Du hast mir den Löwen anteil bereits erklärt soweit ich das sehe.
    Die QWidgets sind okay


Anmelden zum Antworten