【发布时间】:2012-10-22 12:39:08
【问题描述】:
我通过确保继承层次结构中的类实现虚拟读写功能来实现序列化:
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”函数的重载,以允许通过基类指针轻松输入/输出:
#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 设计?
【问题讨论】:
-
如果您不向我们展示宏包含的内容或编译器错误是什么,我们将无法回答...
-
好的,抱歉,我已经更新了问题,希望它现在包含足够的细节。我以为我在处理标准问题时犯了一个简单的错误......
-
为原型化的纯虚函数提供函数定义。尽管成员函数可能是纯虚函数,但可以提供函数定义,而不仅仅是基类中的原型。这个定义可以从派生类中调用。
-
您可以将宏调用替换为您的抽象类之一的实际扩展并检查编译器错误。这样追踪起来会容易得多。
-
回复 damienh:这似乎并不能解决问题,尽管如果我将方法设为虚拟,它当然可以工作。不过,我真的不希望实例化基础。
标签: c++