Allgemeine Objekt-Persistenz
-
Hallo,
ich schreibe gerade an einer eigenen Bibliothek und würde gerne die
Datei Ein/Ausgabe allgemein lösen, ähnlich wie es in Java mit Serialize
möglich ist.
Mein Problem ist der Zusammenhang zwischen Datenbankschema und Sprachschema;
so fehlt mir nach der Übersetzung eines C++ Programms die Kenntnis über die
Anordnung der Attribute eines Objektes.Beispiel:
class Dummy { attribute x, y; };Kann ich wissen wie der Compiler die Attribute bei der Übersetzung im
Speicher anordnet, um eine Runtime-Interpretation zu ermöglichen ?
Bei gleicher Reihenfolge etwa könnte y mittels &Dummy + sizeof(x) angesprochen
werden.
Die Idee ist es Objekte während der Laufzeit dynamisch, aus einem Datenbankschema zu erzeugen.
Hat schon jemand so etwas versucht ?
Es scheint mir nicht einfach zu sein, vielleicht zu kompliziert - aber eine
Lösung wäre sehr schön. Das Ein/Ausgabe Problem könnte man getrost abhakenMacht´s gut, ich freu mich über jede Antwort
-
Der Standard definiert AFAIK nicht vollständig, wie genau diese Attribute im Speicher angeordnet werden, aber zumindest die Reihenfolge ist eben so. Auch kommst du zur Laufzeit nicht an die Variablennamen heran. Was du machen kannst, ist aber eine Liste mit Attributen, welche dann eben immer dynamisch wächst und die DB nachbildet.
Bye, TGGC (Keine Macht den Dummen)
-
Schade, dass es keinen Standart gibt; es waere echt frustrierend, wenn das ganze System nicht mehr mit einer neuen GCC-Version laufen würde.
So wie ich es mir gedacht habe, wären die Attributnamen während der Laufzeit
bekannt, da die Datenbank-Schemas aus dem Quelltext erstellt würden.
Eine Art Nachbildung von Java-Reflection also. Schade, dass es so etwas nicht
für C++ gibt.Ich bekomme aber den Eindruck, dass diese Idee viel zu aufwendig umzusetzten ist.
euch alles Gute,
metachris
-
metachris_ schrieb:
Bei gleicher Reihenfolge etwa könnte y mittels &Dummy + sizeof(x) angesprochen werden.
Grundsätzlich liegen die Attribute schon ab dem this-Zeiger in der Reihenfolge im Speicher, wie sie auch in der Klasse definiert sind. Allerdings liegen zuerst immer die Attribute aller Basisklassen da, erst danach die Attribute der eigentlichen Klasse. Zusätzlich können beliebige Paddingbytes vom Compiler eingesetzt werden, wenn er es denn für nötig hält. Und das kannst Du nicht ohne weiteres rausfinden. Außerdem ist Mehrfachvererbung hier ein Fallstrick.
Einen standardkonformen Weg gibt es meines Wissens nach nicht.