编写广义保存和读取

时间:2013-09-28 12:39:42

标签: c++ visual-c++ c++11

我想写一个类来读取和写入文件中的对象。我使用template关键字来实现这个目标。

 template<class T>
 class A{
  private:
   std::string filePath;//This will use to indicate the path of proper file.
  public:
    void save(T a){
     //write the given object to the file. The path is fetched by filePath
    }
    std::list<T> read(){
    //read the file and put each line in the list. The path is fetched by filePath
    }
    A(std::string path):filePath(path){}
 };

如果我使用这个方法,当我将它与原始类型(如int,float或float)一起使用时,一切都很好。但是当我想要处理对象时会出现问题,例如Circle,Rectacngle。 我该怎么做才能解决问题

1 个答案:

答案 0 :(得分:4)

您可能需要serialization(或者甚至可能需要persistency,例如application checkpointing ...)。有时它被称为数据酸洗

您可以使用s11n库(提供用于序列化C ++数据的模板)。

您还可以在自己的课程中定义operator <<operator >>,因此使用Rectangle r;代码std::cout << r;std::cin >> r;

您可以考虑文本序列化格式,例如JSON(或YAML或XML ...),例如使用jsoncpp

序列化任意图形比序列化树状数据结构要困难得多(因为circular references和共享指针......)。

在C ++中没有简单的自动方式来获取序列化功能,你可能不需要它。想象一下,你在某些班级中代表Person - s之间的人类婚姻。出于效率原因,您可能希望有两个表(类型为std::map<(Person,Person>),一个映射妻子给每个丈夫,另一个映射丈夫给每个妻子(你想要两个表因为你经常查询某个女人的丈夫,或某个男人的妻子)。但你可能不希望序列化这两个表(它们在某种程度上是“多余的”),只是一组丈夫和妻子对。这是为了说明序列化通常是特定于应用程序的