2017-06-01 5 views
0

Für mein aktuelles Projekt möchte ich eventuell den Spielstatus in eine Datei speichern können.Speichern von Variablen aus mehreren Klassen in Datei

Ich bin auf der Suche nach einem ziemlich einfachen System, wo ich die erforderlichen variablen Daten im ASCII-Format speichern.
Aber. Wie sammle ich alle Variablen?

Muss ich

  • Geben Sie die ofstream (Datei-Stream) Objekt rund um alle erforderlichen Klassen?
  • Holen Sie die Variablen durch einige Getter-Methoden?
  • Speichern Sie alle an einem Ort?
  • Andere?

Natürlich muss ich später auch die Vars aus der Datei initialisieren.

Ich habe es schwer, hier eine Entscheidung zu treffen. Also frage ich demütig um ein paar Tipps.

Prost!

+0

Alle Antworten, die Sie erhalten, sind ziemlich meinungsbezogen, also vielleicht nicht die beste Frage für SO. Aber ich werde meine Meinung trotzdem sagen: Ich denke, Daten von Gettern zu holen, ist KEINE gute Idee, da Sie verschiedene Objekte haben können, die anders speichern. Ich denke, die beste Option besteht darin, für jedes Objekt, das Sie in der Datei speichern möchten, die Funktion Speichern zu haben und die Speicherfunktion für alle Objekte aufzurufen, die in Ihrer Ebene gespeichert werden können. In diesem Sinne ist es wahrscheinlich am besten, alle speicherbaren Objekte in einer Datenstruktur zu speichern und das Datei-Stream-Objekt iterativ an jedes dieser Objekte weiterzugeben. – bpgeck

+0

Ja, ich denke, das ist nicht der richtige Ort für diese Fragen. Danke für die Antwort - scheint vernünftig. – ludolover

+1

Speichern Sie die Daten in einem Format wie XML oder Init. Verwenden Sie eine Bibliothek zum Lesen und Schreiben der Daten. Suchen Sie auch im Internet nach "C++ Struct Serialization". –

Antwort

0

HINWEIS: Ich habe C++ seit Ewigkeiten nicht mehr verwendet, so dass die Verwendung von Syntax/Bibliotheksfunktionen nicht ganz genau ist. Hoffentlich liefert es aber die Idee.

Designmuster zur Rettung! Registrieren Sie einige Handler in einer Save Klasse, die jede der Variablen für Sie speichert.

Zuerst definieren wir eine interface:

class ISerializable { 
public: 
    virtual std::vector<byte> serialize() { throw new NotImplementedException; } 
} 

Als nächstes schreiben wir unsere Save Klasse jeder der Handler zu speichern:

class Save { 
    std::map<std::string, ISerializable> handlers; 

public: 
    void save(string filename) { 
     // Open file as writeable bytes 
     std::ofstream outFile(filename, std::binary | std::trunc); 

     // You may want to use an iterator here. 
     // I forgot the exact syntax. 
     // pair.Key is the name 
     // pair.Value is the class you are saving 
     foreach(pair in handlers) { 
      // This is an example. 
      // Your actual file format will be a bit more complicated than this. 
      outFile << "Name: " << pair.Key 
       << "Data: " << pair.Value.serialize(); 
     } 
    } 

    void attachHandler(std::string name, ISerializable handler) { 
     handlers[name] = handler; 
    } 
} 

dann für jede Variable, die Sie speichern möchten, definieren ein Serialisierungsfunktion für seine Klasse:

class MyObject : public ISerializable { 
public: 
    std::vector<byte> serialize override { 
     // return some list of bytes 
    } 
} 

Und anhängen seine Handler auf eine Save Instanz: Speichern von Roh-Bytes kann schwierig sein, wenn nicht richtig gemacht:

Save save; // Instantiate your saving object. 
      // Consider making this static. 

MyObject myObject; 
save.attachHandler("myObject", myObject); 

Sie könnten XML als Speicherformat zu betrachten.

Verwandte Themen