Tag zusammen, ich habe in C++ Objekte, die wiederum andere Objekte "beinhalten", das Ganze bildet dann eine Art gewurzelten Baum. Ich würde diese Hierachie gerne abspeichern und auch wieder laden können. XML ist wohl dafür geeignet, aber evtl etwas zu oversized? Auserdem bin ich da nicht wirklich Freund von... Wie würdet ihr denn so eine Struktur abspeichern?
Michl schrieb:
Möchtest du die Objekte selbst abspeichern, oder nur die Referenzen
darauf (also die Baumstruktur)?
Eine Möglichkeit ist, zu jedem Objekt die Referenz auf das Elternelement
mitzuspeichern.
Das Ganze nennt sich "Objekte serialisieren". Gibt es meines Wissens nach für jede OOP-Sprache Mittel und Wege dazu. Tante Gugel sagt zum Beispiel: c++ objekte serialisieren --> http://www.highscore.de/cpp/boost/serialisierung.html http://stackoverflow.com/questions/523872/how-do-you-serialize-an-object-in-c http://home.f1.htw-berlin.de/scheibl/VCNET/Tutorium/index.htm?./Klasse/SpezielleKlasse.htm$Serialisierung
Jan Hansen schrieb: > Möchtest du die Objekte selbst abspeichern, oder nur die Referenzen > darauf (also die Baumstruktur)? Soweit ich das beurteilen kann reichen mir Referenzen. Meine SW soll eben in der Lage sein, den "Baum", der sich aus Usereingaben ergibt, in einer späteren Sitzung wiederherzustellen. Den Begriff "Serialisierung" kannte ich bisher noch nicht. Sieht schon mal gut aus. Wenn man weiß nach was man suchen muss tut man sich doch viel leichter :-)
Michl schrieb: > Soweit ich das beurteilen kann reichen mir Referenzen. Michl schrieb: > Meine SW soll eben in der Lage sein, den "Baum", der sich aus > Usereingaben ergibt, in einer späteren Sitzung wiederherzustellen. Wie soll das gehen wenn du nur Referenzen abspeicherst und nicht die dazugehörigen Daten?
Udo Schmitt schrieb: > Wie soll das gehen wenn du nur Referenzen abspeicherst und nicht die > dazugehörigen Daten? Dann hab ichs wohl falsch beurteilt, bzw. Jan Hansen falsch verstanden.
Dazu brauchst Du ein Format, welches zu jedem Wert seine Position hinzufügt. Andernfalls ist eine Rekonstruktion nicht möglich. Sonderfall: Die Baumstruktur ist gleich der Sortierfolge. Sonderfall: Du speicherst immer einen vollständigen Baum ab und füllst auch leere Blätter mit einer, später rekonstruierbaren Kennung. Es geht nicht weil: Im Herbst ist ein Blatt abgefallen; Im Frühjahr ist es aber nicht wieder gewachsen; Beim Speichern gibt es eine asymmetrische Anzahl an Werten; Welcher ist der Fehlende? Deshalb nur alle oder alle mit Adresse.
Ich lese gerade http://www.boost.org/doc/libs/1_37_0/libs/serialization/doc/index.html und werd das demnächst auch ausprobieren. Zumindest vom Lesen her klingt das einfacher als gedacht.
Das Hauptproblem besteht darin, dass du Information auf dem File benötigst, welche dir eine Rekonstruktion der Verpointerung ermöglicht. Denn das Problem ist natürlich, dass dir die Pointer an sich nicht weiter helfen, denn im nächsten Programmlauf haben die keine Bedeutung mehr. Wenn es (in der Implementierung) schnell gehen muss, dann mach ich das gerne so, dass ich in der Datenstruktur einen 'reserved' Wert bei jedem Knoten habe. Vor dem Speichern werden die Knoten durchnummeriert. Beim Schreiben aufs File wird dann bei jedem Knoten die Nummer seines Vaters im File mit vermerkt. Wenn ich dafür sorge, dass beim Schreiben immer die Väter vor den Söhnen gespeichert werden, dann geht das beim Lesen wieder ganz einfach: nächsten Knoten samt Vaternummer einlesen. Mit einer Find-Funktion den Vater-Knoten im bisherigen Baum suchen und an den wird dann der gerade gelesene Knoten angehängt. Die Schreibroutine ist also eine einfache Rekursive Funktion, während die Lese-Routine eine einfache Schleife darstellt, die jeden gelesenen Knoten anhand der Vaternummer in den Baum wieder an der richtigen Stelle einhängt. Eine andere Möglichkeit wäre, wie Amateur schon angesprochen hat, die Schreibroutine rekursiv auszuführen, wobei jeder Knoten auch die Anzahl seiner Kinder mitspeichert (oder im Falle eines binären Baumes, dann eben die Information, dass es dieses Kind nicht gibt). Dann kann man die Leseroutine symetrisch dazu ebenfalls rekursiv ausführen. Aber egal wie: Dreh und Angelpunkt besteht darin, dass die Schreibroutine Zusatzinformation auf dem File ablegen muss, die den Leseprozess leitet.
:
Bearbeitet durch User
Udo Schmitt schrieb: > Michl schrieb: >> Meine SW soll eben in der Lage sein, den "Baum", der sich aus >> Usereingaben ergibt, in einer späteren Sitzung wiederherzustellen. > > Wie soll das gehen wenn du nur Referenzen abspeicherst und nicht die > dazugehörigen Daten? Das war ja die Frage. Wenn er die Objekte als Stammdaten hat und der User diese Objekte nur anordnet, dann genügen die Referenzen. Wenn der User allerdings die Objekte selbst erstellt und diese abgespeichert werden sollen, dann sollte er serialisieren.
Wenn das ein Binärbaum ist und u.U. etwas Platzverschwendung in Ordnung ist, kann der Baum auch sehr einfach in ein Array gepackt werden (Zeiger werden da nicht benötigt) und dann mit den üblichen Dateifunktionen gespeichert werden. Übliche Formeln dafür wären: Wenn der Index des Vaterknotens n ist, dann stehen die Kinder an den Positionen 2*n+1 bzw. 2*n+2. In die andere "Richtung": Index des Kindes = n, dann ist der Vaterknoten bei (n-1)/2 Für andere Bäume bzw. allgemein kann man's hier nachlesen http://en.wikipedia.org/wiki/K-ary_tree
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.