从文件加载对象的最佳设计是什么?有很多可能性,其中一些如下所示。
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);
};
答案 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
}
如果流引发错误异常,这种方法也会一样。