我已经通过确保继承层次结构中的类实现虚拟读写函数来实现序列化:
class base
{
...
virtual void read(std::istream&)=0;
virtual void write(std::ostream&) const=0;
virtual std::string is_a() const;
};
BEGIN_NAMESPACE_1(io)
SERIALISE(base)
END_NAMESPACE_1
宏“SERIALISE”实现了“serialise”和“deserialise”函数的重载,以允许通过基类指针轻松进行i / o:
#define SERIALISE(TYPE)\
void deserialise( boost::shared_ptr<TYPE>& dat, std::istream& ifs )\
{\
std::string type;\
read(type, ifs);\
\
dat = TYPE::make_##TYPE(type);\
dat->read(ifs);\
}\
\
void serialise( const boost::shared_ptr<TYPE>& dat, std::ofstream& ofs )\
{\
write(dat->is_a(), ofs);\
dat->write(ofs);\
}
但是,如果基类包含纯虚函数,我得到一个编译器错误“不能分配抽象类型的对象”base“因为以下函数是纯粹的”base“...”,大概是因为编译器试图将类名传递给宏调用时,实例化抽象基类。有没有办法挽救这种i / o设计?
答案 0 :(得分:1)
您无法实例化抽象基类或将其用作函数的值参数。
模板显式shared_ptr(Y * p);要求:p必须 可转换为T *。 Y必须是完整类型。表达式删除p 必须格式良好,不得调用未定义的行为,绝不能 抛出异常。
效果:构造一个拥有指针p的shared_ptr。
后置条件:use_count()== 1&amp;&amp; get()== p。
抛出:std :: bad_alloc,或者当a执行时定义的异常 无法获得除内存以外的资源。
异常安全:如果抛出异常,则调用delete p。
注意:p必须是指向通过C ++分配的对象的指针 新表达式或为0.使用计数为1的后置条件成立 即使p为0;在值为0的指针上调用delete是 无害。
在这种情况下,编译器不必将模板shared_ptr解析为具有TYPE类型的值,因为它们永远不会被实例化。