Klasse speichern mit QDataStream

cesupa

Erfahrenes Mitglied
Hallo,

ich möchte gerne eine Klasse mit all ihren Variablen möglichst komfortabel speichern. Da in der Klasse aber z.B. QStrings drin sind, kann ich die Klasse über den this-Zeiger ja nicht so einfach in eine Datei packen. Also so hier gehts ja glaube ich nicht:

Code:
QDataStream* out=new QDataStream;
	QFile* file=new QFile(dst);
	
	if(!file->open(QIODevice::WriteOnly))
		return false;
	
	out->setDevice(file);
	out->writeBytes((const char*)this,sizeof(*this));
	
	delete file;
	delete out;
	
	return true;

Jetzt in der Klasse z.B. nur ein QString drin. Wenn ich das speichere, speichert der mir eigentlich nur den Zeiger des QStrings und nicht seinen Inhalt selber. So hab ich das zumindest Verstanden. Muss ich da jetzt jede Variable einzeln in den DataStream schreiben oder gibt es irgendeinen Trick, um das ganze mit einmal in eine Datei zu packen?

Gruß
cesupa
 
Hi

die kannst für deine Klasse zwei Operatoren überschreibe, nämlich

Code:
zum schreiben:
 QDataStream& operator<<(QDataStream &outStream, const Deine_klasse &data)

zum lesen:
 QDataStream& operator>>(QDataStream &inStream, Deine_Klasse &data)

in den beiden Operator schreibst bzw liest du die einzelnen Membervariabeln deiner Klasse und der gleichen Reihenfolge in bzw aus dem Stream.

Zusätzlich solltest du die beiden Operatoren noch als "friend" in deiner Klasse definieren, damit auch private Member ohne Setter/Getter gespeichert werden.

Somit kannst du dann einfach deine Klasse speichern.
Bsp:

Code:
Deine_Klasse obj;
QDataStream str;

str << obj; // schreiben

str >> obj; // lesen

LG
 
Okay, Danke für den Tip.
Gibt es eigentlich eine Möglichkeit, die Variablen(-namen) in der Klasse zu erkennen? Durch Precompileranweisungen oder so?


Gruß
cesupa
 
Zuletzt bearbeitet:
Hi

nich das ich jetzt wüsste, aber wenn ich richtig denke, was du vorhast, es geht auch so

Code:
void Deine_Klasse::speichern() {
  QDataStream str(...);

  str << *this;

}

lg
 
Das hab ich schon probiert, man muss die Klasse erst in ein const char* umwandeln, dann kann man die speichern, aber er speichert eben nur den Zeiger des QStrings, der in der Klasse ist. Aber ich werd's jetzt so machen, dass ich alle Variablen einzeln in den DataStream schreibe.

Gruß
cesupa
 
Hi

du kannst das so machen, wie in meinem letzten Posting, dafür musst du aber die beiden operatoren überladen haben. Dann geht das.

lg
 
Gut, läuft aber wieder darauf hinaus, dass ich jeder Variable einzeln speichern muss :rolleyes: Aber ich werd's trotzdem so machen, wie du gesagt hast. Danke für deine Hilfe.

Gruß
cesupa
 
Zurück