从文件设计加载对象

时间:2014-01-06 18:09:31

标签: c++

从文件加载对象的最佳设计是什么?有很多可能性,其中一些如下所示。

class object
{
public:
    object(const std::string& filename);
};

class object
{
public:
    object();
    void load_from_file(const std::string& filename);
};

class object
{
public:
    static object load_from_file(const std::string& filename);

    object(object&& an_object);
};

class object
{
public:
    std::unique_ptr<object> load_from_file(const std::string& filename);
};

class object_loader
{
public:
    std::unique_ptr<object> load_object_from_file(const std::string& filename);
};

并且列表继续......

编辑:

我选择的设计是:

class object
{
public:
    object();
};

class object_loader
{
public:
    void load_from_stream(object& an_object, std::istream& input_stream);
};

2 个答案:

答案 0 :(得分:2)

我更喜欢'class object_loader',它将IO加载器与容器分开,允许将来实现不同的加载器(来自txt,binary,xml ...文件),而无需修改原始数据容器。更好的测试可能。如果不允许IO(如嵌入式设备等),也可以从应用程序中删除IO。

答案 1 :(得分:2)

  

从文件加载对象的最佳设计是什么?

最好的设计通常是这样的:

class object { public: object(); /* ... */ }; // object is default constructible

std::istream& operator >> (std::istream& in, object& o);

客户代码:

// from file:
std::ifstream fin(path);
object o;
fin >> o;
// from serialized string:
std::string contents = ".....";
std::istrigstream ssin(contents);
ssin >> o;

编辑:

交易实施:

std::istream& operator >> (std::istream& in, object& o)
{
    int i; std::string word; // example data required by object instance
    if (in >> i >> word)
    { // read was successful for all data
        o.set_index(i);
        o.set_word(word);
    }
    return in;
}

// client code:
if(ssin >> o)
{ // read was successful
    // use o here
} else {
    // o is still as default-constructed
}

如果流引发错误异常,这种方法也会一样。