crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Not_Once
  опции профиля:
сообщение 13.3.2014, 18:24
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 13.3.2014
Пользователь №: 4076

Спасибо сказали: 0 раз(а)




Репутация:   0  


Доброго времени суток! Не судите строго - опыта мало. Вообщем, нужна помощь, уже в конец запутался. Весь проект, естественно тащить не буду, попытаюсь на примере.
Допустим, имею:
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, но сам вектор забивается последним объектом и программа вылетает. Я уже вконец запутался с указателями и объектами.
Вопрос: подскажите, что делаю не так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Trisch
  опции профиля:
сообщение 13.3.2014, 18:58
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 379
Регистрация: 30.1.2012
Из: Запорожье
Пользователь №: 3169

Спасибо сказали: 24 раз(а)




Репутация:   0  


Я вот тоже в указателях иногда путаюсь. Но вот думаю что проблема может быть тут:
QVector<Cube*>  *Data_Cubes;


сделайте так:
QVector<Cube>  *Data_Cubes; // указатель на вектор который хранит хначения Cube
//или так
QVector<Cube*>  Data_Cubes; // вектор который хранит указатели на значения Cube
//или так
QVector<Cube>  Data_Cubes; // вектор который хранит значения Cube


правильный вариант зависит от того что вам надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 28.5.2025, 17:26