Seite 1 von 1

Objekt in Datei speichern

Verfasst: 27. März 2010 17:31
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]

Verfasst: 27. März 2010 19:16
von 24dan
mal versucht das ganze wirklich mit

Code: Alles auswählen


for(quint8 i....

laufen zu lassen?

Re: Objekt in Datei speichern

Verfasst: 27. März 2010 19:36
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 :)

Verfasst: 28. März 2010 13:02
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.

Verfasst: 28. März 2010 20:30
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]

Verfasst: 29. März 2010 17:12
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)

Verfasst: 29. März 2010 17:47
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

Verfasst: 29. März 2010 19:42
von Christian81
Abgesehen davon kompiliert der im ersten Post gezeigte Code mit msvc2005 und gcc 3.4