【发布时间】:2012-03-06 18:26:31
【问题描述】:
是否可以直接从存档中构造对象?
这样的……
// Non-working pseudo code
struct Foo {
BOOST_SERIALIZATION_SPLIT_MEMBER();
std::vector<int> data;
Foo() {
// populate "data" by doing calculation
data.push_back(1); data.push_back(2);
}
template<class Archive>
Foo( Archive & ar ) {
// populate "data" by rading the archive
}
template<class Archive>
void save(Archive & ar, const unsigned int version) const {
// Normal serialization of data
ar << data;
}
};
int main(int argc, const char *argv[])
{
// deserialize
boost::archive::text_iarchive oar(std::cin);
Foo foo(oar);
return 0;
}
【问题讨论】:
-
是的,为什么不呢?只需添加“ar >> data;”在构造函数中,你就完成了。 (真正的挑战是“数据”是否为常量)
-
@alfC 如果 'data' 没有默认构造函数,你会怎么做?
-
@DavidDoria,正如 Alexander Stepanov 所说,“如果你不让你的类默认可构造,那么你就会得到你应得的”。所有类都应该有一个默认构造函数,如果没有(并且您无法控制它),您必须在
Foo( Archive & ar ) : data(something) {级别解决此问题,或者具有Foot(Archive & ar) : data(somefunction(ar)){的间接级别(但有些东西在第一名)。 -
@alfC 默认构造函数有什么好处?它只会增加您的对象可能处于的状态数量(其中大部分是您必须注意的不良/无效状态),不是吗?
-
@DavidDoria,您将默认构造函数与未初始化的变量混淆了。默认构造函数应该让您的对象处于有效状态(如果可能的话,也是可预测的状态)。
标签: c++ boost boost-serialization