我想写一个类来读取和写入文件中的对象。我使用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。 我该怎么做才能解决问题
答案 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>
),一个映射妻子给每个丈夫,另一个映射丈夫给每个妻子(你想要两个表因为你经常查询某个女人的丈夫,或某个男人的妻子)。但你可能不希望序列化这两个表(它们在某种程度上是“多余的”),只是一组丈夫和妻子对。这是为了说明序列化通常是特定于应用程序的。