LINUX.ORG.RU

Сохранение бинарных данных своего типа. Qt


0

0

Здравствуйте!

	struct projectfile {
	QString name;
	QString family;
	};
	projectfile prfile;
	prfile.name = nameEdit->text();
	prfile.family = familyEdit->text();
	
	QFile file(fileName); //в глобальных fileName  уже есть
	file.open(QIODevice::WriteOnly);
	QDataStream out(&file);
	out.setVersion(QDataStream::Qt_4_3);
	out <<  prfile;

Ошибка:

form.cpp: In member function `void Form::on_saveButton_clicked()':
form.cpp:51: error: no match for 'operator<<' in 'out << prfile'
../../../include/QtCore/../../src/corelib/io/qdatastream.h:136: note: candidates
 are: QDataStream& QDataStream::operator<<(qint8)

Т.е. не получается засунуть туда своб структуру данных... Пробовал делать класс, где в паблике нужные данные были. Таже самая история. Не понимаю почему так.

Как правильно быть, если есть потребность в сохранении своих типов данных.

Всем спасибо.

В projectfile сделай friend'а из QDataStream. И метод соответствующий определи:

friend QDataStream& operator<<(QDataStream& out, const projectfile& that);

mv ★★★★★
()
Ответ на: комментарий от mv

Спасибо. Но всё равно ничего не понял что зачем и почему. С дружесвенными функциями не знаком. Могли бы привести пример? А лучше на моём коде подправить.

Я нашёл выход - создал класс с моими данными. Этот класс наследник QByteArray. Вроде бы сохраняет.. Но по ощущением совсем не то. Проверить еще точно не удалось.

anonymous
()
Ответ на: комментарий от anonymous

#include <iostream>                                                                                                                                         
#include <string>                                                                                                                                           
                                                                                                                                                            
class Dick {                                                                                                                                                
public:                                                                                                                                                     
    Dick(unsigned int len = 0);                                                                                                                             
    ~Dick() {};                                                                                                                                             
    friend std::ostream& operator<<(std::ostream& out, const Dick& member);                                                                                 
                                                                                                                                                            
private:                                                                                                                                                    
    std::string dick;                                                                                                                                       
};                                                                                                                                                          
                                                                                                                                                            
Dick::Dick(unsigned int len)                                                                                                                                
{                                                                                                                                                           
    if (!len) {                                                                                                                                             
        dick = "(|)";                                                                                                                                       
    } else {                                                                                                                                                
        dick.reserve(len + 2);                                                                                                                              
        dick = "8";                                                                                                                                         
        dick.insert(1, len, '=');                                                                                                                           
        dick += "D";                                                                                                                                        
    }                                                                                                                                                       
}
std::ostream& operator<<(std::ostream& out, const Dick& member)                                                                                             
{                                                                                                                                                           
    out << member.dick;                                                                                                                                     
}                                                                                                                                                           
                                                                                                                                                            
int main()                                                                                                                                                  
{                                                                                                                                                           
    Dick dick(10);                                                                                                                                          
    std::cout << dick << std::endl;                                                                                                                         
    return 0;                                                                                                                                               
}

mv ★★★★★
()
Ответ на: комментарий от anonymous

> Люди, подскажите как сделать это... Пока мне безразлично... с фрэндом, без.

Во-первых, изучи C++, дабы понять, почему нельзя сохранить любую структуру данных в поток, как ты это собирался сделать.

Во-вторых, для платформенно независимой сериализайии(а именно так это и называется!) используй boost::serialization или сохраняй как XML с помощью QtXml модуля.

В-третьих, попробуй выбрать язык, где сериализация "искаропки". Например, Java или Tcl.

gaa ★★
()
Ответ на: комментарий от mv

>А как без френда?

Зачем делать функцию членом класса , если нет в этом необходимости ?
Все члены структуры открыты , сойдет обыкновенная функция .

kitov ★★★
()
Ответ на: комментарий от kitov

>>Зачем делать функцию членом класса

ну дык эта функция и не член класса. Просто mv зачем-то использовал class, когда достаточно struct и соотв-но friend-объявления не надо.

alex_custov ★★★★★
()
Ответ на: комментарий от mv

>>~Dick() {};

Разные версии gcc на ';' отреагируют по-разному ;)

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

> ну дык эта функция и не член класса. Просто mv зачем-то использовал class, когда достаточно struct и соотв-но friend-объявления не надо.

Топикстартер в конце про класс упомянул, вот он у меня в памяти и засел.

mv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.