Пусть следующий код:Сохранение вектора указателей в файл и читать их снова
// 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, а не объект, на который указывает указатель, который он обертывает. Я даже не могу это построить! Даже с объектом вы не можете просто передать его в blob байтов. Вам нужно посмотреть на сериализацию и перегрузить оператор << или предоставить вашим классам метод 'write()', который принимает значение, которое затем записывает их члены. –
Вам необходимо обеспечить правильную сериализацию и десериализацию для ваших типов (http://en.wikipedia.org/wiki/Serialization). – Chad
Это не работает. Вы не можете сохранить указатель в файле, это связано с тем, что адреса действительны только во время выполнения и если вы не освобождаете их от них. вам нужно будет сериализовать данные, а затем записать их в файл. Это означает, что вам нужно сохранить значение, а не адрес. –