Допустим, имею:
1) Класс Cube c разнородной информацией и де-/сериализатором для потока.
Раскрывающийся текст
class Cube
{
public:
bool a;
int b;
char c;
friend QDataStream &operator<< (QDataStream &write, const Cube &cb);
friend QDataStream &operator>> (QDataStream &read, Cube &cb);
};
QDataStream &operator<< (QDataStream &write, const Cube &cb) //Сериализация
{
write << cb.a;
write << cb.b;
write << cb.c;
return write;
}
QDataStream &operator>> (QDataStream &read, Cube &cb) //Десериализация
{
read >> cb.a;
read >> cb.b;
read >> cb.c;
return read;
}
2) Класс Data с объявленным вектором указателей на объекты Cube и методами записи/чтения в данных из/в файл
Раскрывающийся текст
class Data
{
public:
QVector<Cube*> *Data_Cubes; //Данные по кубам
void save(QVector<Cube*> *Cubes);//Запись в файл
void load(QVector<Cube*> *Cubes);//Чтение из файла
};
void Data::save(QVector<Abonent *> &Cubes)
{
QFile File("Cube.dat");
if(File.open(QIODevice::WriteOnly))
{
QDataStream write(&File);
write << Cubes; //В стандартной библиотеке сериализатор для QVector описан
}
//Проверки различные и выводы сообщений, касаемые файла и потока опустим
}
void Data::load(QVector<Abonent *> &Cubes)
{
QFile File("Cube.dat");
if(File.open(QIODevice::ReadOnly))
{
QDataStream read(&File);
read >> Cubes; //В стандартной библиотеке десериализатор для QVector описан
}
//Проверки различные и выводы сообщений, касаемые файла и потока опустим
}
3)В QDaraStream предусмотрены де-/сериализатор для QVector:
Раскрывающийся текст
template<typename T>
QDataStream& operator<<(QDataStream& s, const QVector<T>& v)
{
s << quint32(v.size());
for (typename QVector<T>::const_iterator it = v.begin(); it != v.end(); ++it)
s << *it;
return s;
}
template<typename T>
QDataStream& operator>>(QDataStream& s, QVector<T>& v)
{
v.clear();
quint32 c;
s >> c;
v.resize(c);
for(quint32 i = 0; i < c; ++i) {
T t;
s >> t;
v[i] = t;
}
return s;
}
4)Основное окно, с общей информацией, откуда вызываю запись и чтение данных
Раскрывающийся текст
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
Data *Data_common;//Общие данные
};
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
Data_common = new Data;
Data_common->load(*Data_common->Data_Cubes);//Чтение
}
MainWindow::~MainWindow()
{
delete ui;
Data_common->save(*Data_common->Data_Cubes);//Запись
/// Есть ли необходимость в удалении указателя? (обнуление для избежания проблем)
delete Data_common;
Data_common=0;
}
При текущем варианте, данные пишутся и читаются в десериализаторе Cube, но сам вектор забивается последним объектом и программа вылетает. Я уже вконец запутался с указателями и объектами.
Вопрос: подскажите, что делаю не так?