我认为没有直接的方法可以消除这种开销。通常这是通过两件事来完成的。首先,对象需要一个序列化机制:
要序列化事物,需要一个位置来序列化。在这种情况下,我们将使用数据容器来执行此操作,但这也可以是文件流或容器类。序列化可以从对象内部或外部进行,现在最简单的实现是从内部进行:
简单的序列化部分:
class Shape{
public:
virtual void serialize( Datacontainer &o ) const = 0;
};
class Triangle: public Shape{
void serialize( Datacontainer &o ) const{
o.add('T');
o.add(corners);
}
std::vector<point> corners;
}
class Circle: public Shape{
void serialize( Datacontainer &o ) const{
o.add('C');
o.add(center);
o.add(radius);
}
point center;
double radius;
}
在序列化过程中,您可以使用基本类 Shape 来做到这一点:
Shape *tri = new Triangle;
tri->serialize( dataContainer or file );
反序列化并不容易,因为您需要知道类型。一个很好的模式是Builder 模式。尽管如此,我们可以实现一个更可能的 C++ 方式来做到这一点:
将以下内容添加到您的所有课程中:
static Shape* createFrom( Datacontainer &o );
例如。圈子实现:
Shape* Circle::createFrom( Datacontainer &o )
{
Circle *c = new Circle()
c->center = o.get();
c->radius = o.get();
}
这使我们能够创建一个具体的实例,但我们有该方法的通用函数足迹。现在可以实现一个非常简单的构建器,如下所示:
class ShapeBuilder
{
public:
static Shape* createShape( Datacontainer& o )
{
char id = o.get();
swith(id){
case 'T':
return Triangle::createFrom(o);
case 'C':
return Circle::createFrom(o);
}
}
}