2017-06-01 55 views
0

對於我當前的項目,我希望最終能夠將遊戲狀態保存到文件中。將多個類的變量保存到文件

我正在尋找一個非常簡單的系統,以ASCII格式存儲所需的可變數據。
但是。我如何收集所有變量?

難道我

  • 通過周圍的ofstream的(文件流)對象所有必需的課程?
  • 通過一些getter-methods獲取變量?
  • 將它們全部保存在一個地方?
  • 其他?

當然,我也將不得不從文件中初始化變量。

我似乎很難在這裏作出決定。所以我很謙虛地問一些技巧。

乾杯!

+0

您將收到的所有答案都將基於觀點,因此可能不是SO的最佳問題。然而,無論如何,我會給出我的看法:我認爲從getters獲取數據不是一個好主意,因爲您可以使用不同的對象進行不同的保存。我認爲最好的選擇是爲要保存到文件的每個對象設置保存功能,併爲您的關卡中的所有可保存對象調用保存功能。考慮到這一點,最好將所有可保存的對象存儲到某個數據結構中,並將文件流對象傳遞給這些迭代中的每一個。 – bpgeck

+0

是的,我想這不是真正的這些問題的地方。感謝您的答案,但似乎是合理的。 – ludolover

+1

以XML或Init等格式存儲數據。使用庫來讀取和寫入數據。也搜索「C++結構序列化」的互聯網。 –

回答

0

注意:我沒有在年齡中使用C++,所以使用語法/庫函數並不完全準確。不過,希望它能傳遞這個想法。

救援的設計模式!將一些處理程序註冊到Save類中,該類將爲您保存每個變量。

首先,我們定義了一個interface

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

接下來,我們寫Save類來保存每個處理程序:

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; 
    } 
} 

然後爲要保存每個變量,定義序列化功能:

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

並附上它的處理程序,以一個Save實例:

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

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

你可能要考慮XML作爲存儲格式:存儲原始字節可能會非常棘手,如果不這樣做的權利。

相關問題