Persistente Objekte in C++?
-
Hi Leute,
derzeit bastle ich am Objekt orientieren Skelett für ein Spiel.
Dazu gehört natürlich, dass sich jedes Objekt selbst zeichnen, verwalten
und speichern kann und genau hier liegt das Problem:Wie kann man die Serialisierung von Objekte besser realisieren als so:
// Hier die Implementierungen der ensprechenden Funktionen meiner Object-Klasse ofstream& Object::store(ofstream& out) { out << m_sName << '\0'; out.write((char*) &m_iImage, sizeof(m_iImage)); return out; } ifstream& Object::restore(ifstream& in) { getline(in, m_sName, '\0'); in.read((char*) &m_iImage, sizeof(m_iImage)); return in; }
Das Problem ist, dass ich mir, sobald die erste Klasse mir mehr als 20 Membern
auftaucht, auch noch daran die Finge wundtippen muss...
Das geht doch bestimmg effizienter und eleganter oder?Danke im Voraus,
KhadgarP.S.
Wie sieht der Inhalt der binären Datei anders aus wenn ich das Object nicht wie
oben, sondern wie folg speichere?Object o("Gnarf", 21312); fstream file("Object.dat", ios::out|ios::binary); file.write((char*) &o, sizoeof(Object));
P.P.S.
Läßt sich die obigen Möglichkeit auch über this-Zeiger als Memberfunktion
implementieren? Hab damit Heute ein wenig rumprobiert, aber irgendwie wollte
das nie so wie ich.
-
Wieso überlädst du den << Operator nicht für das schreiben in die Datei?
-
<< ist i.A. für Textausgaben gedacht.
-
@MastaH:
Wie sähe daß dann aus un welche Vorteile / Nachteile brächte es mit sich?
-
Das löst deine technischen Fragen nicht, bringt nur eine andere (hier nicht angebrachte) Syntax mit sich.
-
Ok, also nochmal Frage an die Allgemeinheit
Wie würdet Ihr Objekte persistent machen, wenn nicht wie dargestellt?
-
Nimm statt ofstream und ifstream lieber ostream und istream,
dann bist du bei der Architektur unabhäniger, kannst später
dann evtl. auch eigene Streams nutzen.Devil
-
Khadgar schrieb:
Das Problem ist, dass ich mir, sobald die erste Klasse mir mehr als 20 Membern
auftaucht, auch noch daran die Finge wundtippen muss...
Das geht doch bestimmg effizienter und eleganter oder?Leider nein, aber 20 Member sollte man sowieso nicht haben.
C++ bietet leider keine Reflection API...
-
Shade Of Mine schrieb:
Leider nein, aber 20 Member sollte man sowieso nicht haben.
Öhm. Mag sein, aber wie vermeide ich daß?
Ich habe (fast) am Ende meines UML eine Klasse 'Creature' von welcher dann
noch die Klassen 'Held', 'Monster', 'NPC' abstrahiert werden, aber die
zuerst genannte Klasse verfügt schon über 6 Attribute (Stärke etc.), 5 weitere
Stati (zb. Mana), 14 Slots für Ausrüstungsgegenstände uvm.Egal. Btt: Gibts da wirklich nichts? Wie macht Ihr das denn?
Gruß,
Khadgar
-
Also die Slots sind schonmal ein Array und damit nur 1 Variable.
Was die Attribute betrifft: wäre da eine map nicht vielleicht angebracht? Ich kenne dein Design nicht, ich kann deswegen nur raten.
Aber wenn du viele attribute hast - dann würde ich die irgendwie zusammenfassen. Angenommen der Held erhält ein +1 auf alle Attribute - das ist doch 'a pain in the ass', oder?
uU würde eine map hier gute arbeit leisten.
-
*g* Ich glaube ich werds so angehen.
Das mit dem Array auf jeden Fall und die Map je nach Implementierungsaufwand.Vielen Dank für die Anregungen!!!!