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,
    Khadgar

    P.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!!!!


Anmelden zum Antworten