【发布时间】:2013-11-01 15:10:18
【问题描述】:
假设以下代码:
// Base class
class Base {
public:
Base(int val) : hi(val) {
}
virtual void PublicMethod() { /* Do something */}
private:
int hi;
};
// Child class
class Child : public Base {
public:
Child(int val) : Base(val) {
}
void PublicMethod() { /* Do something */}
};
// Vector of pointers to prevent slicing
std::vector<std::shared_ptr<Base>> list;
(...) // Fill list with mixed data of class Base and Child
列表被对象填充后,我想将数据存储到文件中。为此,我尝试了以下方法:
std::ofstream os("data.txt", std::ios::out);
int size1 = list.size();
os.write((const char*)&size1, sizeof(int));
for (auto it = list.begin(); it < list.end(); ++it) {
os.write((const char*)(*it), size1 * sizeof(Base));
}
os.close();
但是我不确定这是否正确,并且从文件中读取数据似乎也无法正常工作。恐怕当我保存数据时sizeof(Base) 也不适用于其大小可能不同的子对象。
即使这工作正常,是否有更好的方法将实际数据存储到文件中,以及如何轻松地从文件中读取数据并将它们存储在shared_ptr<Base> 向量列表中?
任何例子都会有很大帮助。
【问题讨论】:
-
那里有很多错误。取消引用迭代器将获得 shared_ptr,而不是它包装的指针指向的对象。我什至无法建造它!即使使用对象,您也不能将其转换为字节块。您需要查看序列化,并重载运算符 write() 方法,该方法接受一个ofstrem,然后将其成员写入。
-
您需要为您的类型提供适当的序列化和反序列化 (en.wikipedia.org/wiki/Serialization)。
-
这样不行。您不能将指针存储在文件中,这是因为地址仅在运行时有效并且如果您不释放它们。您需要做的是序列化数据,然后将它们写入文件。这意味着您必须存储值而不是地址。
-
@user1158692 对不起,我的错。我试图缩短它但没有测试它。感谢有关序列化和
<<运算符的提示。 @chad 我现在正在调查,谢谢。 @thebaconing 这正是我想要做的。