Russian Qt Forum

Qt => Вопросы новичков => Тема начата: sanaforewer от Март 23, 2012, 12:14



Название: наследование от QIODevice
Отправлено: sanaforewer от Март 23, 2012, 12:14
Задача- создать обьект пользовательского класса записать в файл и считать из него

как я прочел в книжке - всего то надо унаследоваться от класса QIODevice и после этого можно записывать в файл с помощью класса QDataStream
вот мой класс
#ifndef RECEIPT_H
#define RECEIPT_H

#include <QtGui>

class receipt : public QIODevice
{
public:
 receipt(int nu=0, QString da="", double su=0);

 void set_number(const int& i){number=i;}
 void set_date(const QString& s){date=s;}
 void set_sum(const double& d){sum=d;}

 int get_number() const {return number;}
 QString get_date()const {return date;}
 double get_sum()const {return sum;}

private:
 int number;
 QString date;
 double sum;
};

#endif // RECEIPT_H


реализация


#include "receipt.h"

receipt::receipt(int nu, QString da, double su)
{
 number=nu;
 date=da;
 sum=su;
}


до записи дело не дошло так как при компиляции, при создании обьекта моего класса выдает следующую ошибку:

D:\Documents and Settings\sana\PRAKTI4ESKAYA_4\untitled\dialog.cpp:18: ошибка: C2259: receipt: Ґў®§¬®¦® ᮧ¤ вм нЄ§Ґ¬Ї«па  Ўбва Єв®Ј® Є« бб
Ё§-§  б«Ґ¤гойЁе з«Ґ®ў:
qint64 QIODevice::readData(char *,qint64):  Ўбва Євл©
D:\QtSDK\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qiodevice.h(155): б¬. ®Ўкпў«ҐЁҐ "QIODevice::readData"
qint64 QIODevice::writeData(const char *,qint64):  Ўбва Євл©
D:\QtSDK\Desktop\Qt\4.8.0\msvc2010\include\QtCore/qiodevice.h(157): б¬. ®Ўкпў«ҐЁҐ "QIODevice::writeData"

что не так?


Название: Re: наследование от QIODevice
Отправлено: Пантер от Март 23, 2012, 12:28
Это в какой книжке ты такое прочитал???


Название: Re: наследование от QIODevice
Отправлено: _OLEGator_ от Март 23, 2012, 12:30
Всего то надо почитать документацию и определить 2 фунции в классе:
Код
C++ (Qt)
QDataStream &operator<<(QDataStream &, const ClassName &);
QDataStream &operator>>(QDataStream &, ClassName &);

UPD
Видимо под словом "всего то надо унаследоваться от класса QIODevice" подразумевается, что надо лишь унаследовать класс от QIODevice и вся запись и чтение класса произойдет чудесным образом.


Название: Re: наследование от QIODevice
Отправлено: sanaforewer от Март 23, 2012, 12:56
спасибо,
попытался переопределить функции << и >>
QDataStream &receipt::operator <<(QDataStream & out, const receipt & rec)
{
    //return out << rec.get_number()<<rec.get_date()<<rec.get_sum();
    return out<< rec.number<<rec.date<<rec.sum;
}

QDataStream &receipt::operator >>(QDataStream &in, receipt & rec)
{
    //return in >>rec.set_sum()>>rec.set_date()>>rec.set_sum();
    return in>>rec.number>>rec.date>>rec.sum;
}
компилятор ругается, выдает 2 примерно одинаковые ошибки
D:\Documents and Settings\sana\PRAKTI4ESKAYA_4\untitled\..\receipt.cpp:11: ошибка: C2039: <<: ­Ґ пў«пҐвбп з«Ґ­®¬ "receipt"
d:\documents and settings\sana\prakti4eskaya_4\receipt.h(7): б¬. ®Ўкпў«Ґ­ЁҐ "receipt"


Название: Re: наследование от QIODevice
Отправлено: Пантер от Март 23, 2012, 13:14
Удали MinGW\share\locale\ru, чтобы сообщения были на английском.


Название: Re: наследование от QIODevice
Отправлено: sanaforewer от Март 23, 2012, 13:25
удалил, не помогло
изменил язык в Qt в настройках полностью на английский, перезапустил Qt- все равно ниче не изменилось
добавил архив с проектом


Название: Re: наследование от QIODevice
Отправлено: Пантер от Март 23, 2012, 13:39
То есть до сих пор ошибки каркозяблами?


Название: Re: наследование от QIODevice
Отправлено: sanaforewer от Март 23, 2012, 13:41
да
притом он пишет одни ошибки по русски другие "кракозябрами"
но большинство пишет "кракозябрами"


Название: Re: наследование от QIODevice
Отправлено: _OLEGator_ от Март 23, 2012, 14:15
Да уж, тяжко тебе придется. Пытаешься сделать на авось? Вдруг получится без изучения основ и чтения справки?

Почему здесь стоит friend?
Код
C++ (Qt)
   friend QDataStream &operator<<(QDataStream &, const receipt &);
   friend QDataStream &operator>>(QDataStream &, receipt &);

Почему не читаешь справку, где написано это
Код
C++ (Qt)
virtual qint64 QIODevice::readData ( char * data, qint64 maxSize ) = 0
virtual qint64 QIODevice::writeData ( const char * data, qint64 maxSize ) = 0
что требует явного определения этих функций в классах-наследниках.

Ты уж определись, хочешь ли ты наследоваться от QIODevice или просто произвести серилизацию класса.
Во втором случае тебе надо просто определить
Код
C++ (Qt)
QDataStream &operator<<(QDataStream &, const ClassName &);
QDataStream &operator>>(QDataStream &, ClassName &)

вне класса!

UPD
http://qt-project.org/doc/qt-4.8/qdatastream.html#reading-and-writing-other-qt-classes


Название: Re: наследование от QIODevice
Отправлено: sanaforewer от Март 23, 2012, 16:13
Большое спасибо, _OLEGator_ , помогло