为C++程序添加文件保存加载功能(二)

2014-11-24 13:13:40 · 作者: · 浏览: 13
组和容器的功能。因为你可以把指针存储到数组中,串行化库也支持指针。请考虑一下:如果你有一个包含Vertex指针的数组,而且你直接把该数组写入一个文件中,你就会有一堆指针存储在文件中,而不是实际的Vertex 数据。那些指针仅是些数字(内存位置),当后面接着回读数据时它们是毫无意义的。所以,该库十分聪明地从对象中抓取了数据而不是指针。

  考虑到存储作为容器的对象,你要把每一个类串行化。在串行化方法中,你可以读取和写入容器,就象你操作另外一个成员一样。你的容器可以是简单的语言本身内存的数组(如Vertex *vertices[10];),或者是来自于标准库的容器。因为现在是21世纪,我喜欢紧跟时代的步伐,所以我在本例中选择使用标准库。

  尽管你可以在你的串行化类中编写代码,针对容器和每一个成员;然而,你不必这样做。作为代劳,库已十分聪明地自动遍历容器了。你所有要做是仅是写出容器,如下,其中vertices是一个容器:

ar & vertices;
  让库来做其余的工作吧。相信吗?下面是类Polygon的代码,串行化部分以粗体标出:

class Polygon {
 private:
  vector vertices;
  friend class boost::serialization::access;
  template
  void serialize(Archive & ar, const unsigned int version)
  {
   ar & vertices;
  }
 public:
  void addVertex(Vertex *v) {
   vertices.push_back(v);
  }
  void dump() {
   for_each(vertices.begin(), vertices.end(), mem_fun(&Vertex::dump));
  }
};

  首先,请注意我用一个矢量来存储布点。(如果你对模板还是个新手,不要紧,只需要把vector 当作是存储指向Vertex 实例的指针的矢量就行,因为其实际上就是如此。)。下一步,在串行化函数中,我不想遍历该矢量-写每一个成员。相反,我只是读写整个矢量即可:

ar & vertices;
  两个公共方法的建立,可以用来十分方便地操作该多边形。第一个addVertex方法,让你把另外一个结点添加到该多边形上;它使用了push_back方法,这是把一项加到一个矢量上去的标准方法。Dump函数遍历该矢量,把每一个矢量写到标准输出设备上去