Objekt in Datei speichern

Alles rund um die Programmierung mit Qt
Antworten
Mr.Green
Beiträge: 21
Registriert: 6. September 2009 21:50

Objekt in Datei speichern

Beitrag von Mr.Green »

Hallo,
wie ich gelesen habe, gibt es von Haus aus keine Möglichkeit, selbst definierte Objekte in eine Datei zu schreiben (wie in Java "implements Serializable").

Ich habe folgende Datenstruktur:

Code: Alles auswählen

class CubeLayerData
{
public: 
    quint8 row[ROWS_PER_LAYER];
};

class CubeFrameData
{
public:    
     int duration;
    CubeLayerData layer[LAYERS];
};

class CubePictureData
{
public:    
    QList<CubeFrameData> frames;
    QString title;
};

class CubePictureList
{
public:
    QList<CubePictureData> pictures;
};
Ich hatte jetzt von "unten her" versucht, die << und >> Operatoren zu überladen:

Code: Alles auswählen

QDataStream & operator << ( QDataStream & s, const CubeLayerData & d)
{
    for(int i=0; i < ROWS_PER_LAYER; i++)
        s << d.row[i];
    return( s );
}

QDataStream & operator >> ( QDataStream & s, CubeLayerData & d)
{
    for(int i=0; i < ROWS_PER_LAYER; i++)
        s >> d.row[i];

    return s;
}
Da scheitert aber schon der Compiler an der Zeile

Code: Alles auswählen

s >> d.row[i];
Mir ist aber nicht klar warum; laut Hilfe gibt es einen Operator >> und << mit dem Parameter "quint8".

Wie müsste das richtig aussehen, oder gibt es evtl. einen einfacheren Weg, meine Objekt in einer Datei zu speichern?

Gruß
Mr.Green[/code]
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

mal versucht das ganze wirklich mit

Code: Alles auswählen


for(quint8 i....

laufen zu lassen?
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: Objekt in Datei speichern

Beitrag von franzf »

Mr.Green hat geschrieben:Da scheitert aber schon der Compiler an der Zeile

Code: Alles auswählen

s >> d.row[i];
Komplette Fehlermeldung bitte :)
Mr.Green
Beiträge: 21
Registriert: 6. September 2009 21:50

Beitrag von Mr.Green »

for (quint... bringt keine Änderung.

Der Fehler sagt: /home/christian/Qt/Projects/LED_Cube_8x8x8/cube.cpp:38: error: no match for ‘operator>>’ in ‘s >> d->CubeLayerData::row[((int)i)]’

Was mir da ins Auge fällt: Obwohl ich die Laufvariable als quint8 deklariert habe, castet er wohl implizit wieder nach Int. Sollte ja aber egal sein.
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

Machs nicht so kompliziert und verwende durchgehend die Container von Qt. Die haben alles eingebaut, was Du Dir wünscht.

Code: Alles auswählen

	QFile	File("file.dat");
	File.open(QIODevice::WriteOnly);
	QDataStream ds(&File);
	QMap <QString, QString> MyMap;
	MyMap["hick"] = "hack";
	ds << MyMap;
	File.close();
tschüß
Troll.Soft[/code]
Mr.Green
Beiträge: 21
Registriert: 6. September 2009 21:50

Beitrag von Mr.Green »

Das bringt mir nichts.

Ich habe keine Strings, ich habe einen (mehrere) selbst-definierte Typen.
Und eine Map will ich auch nicht, ich will eine Liste.

Selbst wenn ich die Map nehme, brauche ich aber Map<MyType, MyType2>, und dann stehe ich vor genau demselben Problem wieder.
(abgesehen davon, dass ich die Map überhaupt nicht brauchen kann)
Troll.Soft
Beiträge: 190
Registriert: 18. Juni 2008 09:52
Wohnort: Hamburg

Beitrag von Troll.Soft »

Mr.Green hat geschrieben:Das bringt mir nichts.
schade
Ich habe keine Strings, ich habe einen (mehrere) selbst-definierte Typen.
Und eine Map will ich auch nicht, ich will eine Liste.
map will ich nicht, will liste.
Hm, dann ersetze im Beispiel map durch liste.
Dürfte nicht schwer sein.
Selbst wenn ich die Map nehme, brauche ich aber Map<MyType, MyType2>, und dann stehe ich vor genau demselben Problem wieder.
(abgesehen davon, dass ich die Map überhaupt nicht brauchen kann)
eben nicht. Qt kann alle Container serialisieren,
und für eigene Typen mußt Du eben eine eigene Funktion schreiben.


Z.B. so und immer an den typedef denken

Code: Alles auswählen

im .h
	typedef QList	<myObject>	QList_myObject;
	QDataStream& operator<<(QDataStream& ds, const QList_myObject& Value);
im .cpp
	QDataStream& operator<<(QDataStream& ds, const QList_myObject& Value)
	{
	return ds << myObject korrekt rausgeben;	
	}
tschüß Troll.Soft
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Abgesehen davon kompiliert der im ersten Post gezeigte Code mit msvc2005 und gcc 3.4
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten