将多个类中的变量保存到文件中

时间:2017-06-01 22:35:58

标签: c++ structure game-engine

对于我目前的项目,我希望最终能够将游戏状态保存到文件中。

我希望有一个非常简单的系统,我以ASCII格式存储所需的可变数据。我如何收集所有变量?

  • 将ofstream(文件流)对象传递给所有必需的类?
  • 通过一些getter-methods获取变量?
  • 将它们全部存放在一个地方?
  • 其他?

当然,我还需要稍后从文件中初始化变量。

我似乎很难在这里做出决定。所以我谦虚地要求一些提示。

干杯!

1 个答案:

答案 0 :(得分: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视为存储格式:如果处理不当,存储原始字节可能会非常棘手。