Seite 1 von 1

Klassen-Serialisierungs-Problem

Verfasst: 19. Oktober 2008 13:37
von Tom_Tom
Hallo, ich möchte meine Klassen serialisieren
Jetzt habe ich nur das Problem, dass meine Get-Methoden immer leere Werte zurückliefern.

Code: Alles auswählen

//KlasseA.cpp
#include "KlasseA.h"

KlasseA::KlasseA()
{	
}

KlasseA::~KlasseA()
{
}

//Kopier-Konstruktor
KlasseA::KlasseA(const KlasseA & a) {
	wert = a.wert;
}

//Zuweisungsoperator überladen
KlasseA & KlasseA::operator=(const KlasseA & a) {
	wert = a.wert;
	return *this;
}

void KlasseA::setWert(const QString & wert) {
	this->wert = wert;
}

QString KlasseA::getWert() const {
	return this->wert;
}


QDataStream& operator<<(QDataStream & dataStream, const KlasseA & a)
{
	QString wert = a.getWert();
	dataStream << wert;
	return dataStream;
}

QDataStream& operator>>(QDataStream & dataStream, KlasseA (&a))
{
	QString wert;
	dataStream >> wert;
	a.setWert(wert);
	return dataStream;
}

Code: Alles auswählen

//KlasseB.cpp
#include "KlasseB.h"

KlasseB::KlasseB()
{
}


KlasseB::~KlasseB()
{
}

//Kopier-Konstruktor
KlasseB::KlasseB(const KlasseB & a) {
	klasseA = a.klasseA;
}

//Zuweisungsoperator überladen
KlasseB & KlasseB::operator=(const KlasseB & b) {
	klasseA = b.klasseA;
	return *this;
}

void KlasseB::setKlasseA(const KlasseA & klasseA) {
	this->klasseA = klasseA;
}

KlasseA KlasseB::getKlasseA() const {
	return this->klasseA;
}

QDataStream& operator<<(QDataStream & dataStream, const KlasseB & b)
{
	KlasseA klasseA = b.getKlasseA();
	dataStream << klasseA;
	return dataStream;
}

QDataStream& operator>>(QDataStream & dataStream, KlasseB (&b))
{
	KlasseA klasseA;
	dataStream >> klasseA;
	b.setKlasseA(klasseA);
	return dataStream;
}

Code: Alles auswählen

//main.cpp

#include "KlasseB.h"
#include <Qt/QDebug.h>

int main(int argc, char** argv)
{

	KlasseB klasseB;

	klasseB.getKlasseA().setWert("Hallo Welt!");

	qDebug()<< klasseB.getKlasseA().getWert(); //ist leer

	QByteArray byteArray;
	QDataStream streamOut(&byteArray,QIODevice::WriteOnly);
	streamOut << klasseB;

	QDataStream streamIn(&byteArray,QIODevice::ReadOnly);
	KlasseB klasseB2;
	streamIn >> klasseB2;
	qDebug()<<klasseB2.getKlasseA().getWert(); //ist leer

}
Wäre nett, wenn mir da jemand helfen könnte.

Verfasst: 19. Oktober 2008 13:49
von Superheftig
getKlasseA() gibt keine Referenz oder Pointer zurück sondern eie Kopie der Varibalen. Es wird also eine temporäte kopie erstellt und von dieser kopie rufst du die methode setValue auf. Setzt also den wert der temporären kopie und nicht des original objektes. Nach der Abarbeitung der Codezeile wird das temporäre objekt wieder glöscht und alles ist weg.

Die Methode muss entweder
KlasseA& KlasseB::getKlasseA() const oder
KlasseA* KlasseB::getKlasseA() const
sein.

Verfasst: 19. Oktober 2008 13:59
von Tom_Tom
Erstmal danke für die schnelle Antwort.
Ich weiß auch, dass es so ist, wie du es beschrieben hast.

Jetzt aber folgendes Problem.
Wenn ich das so mache, wie du es auch gesagt hast, sagt mein Compiler:
const KlasseA' kann nicht in 'KlasseA &' konvertiert werden.

Und an der Stelle hänge ich dann fest.
Hast du da vielleicht auch eine Lösung?

Verfasst: 19. Oktober 2008 18:25
von solarix

Code: Alles auswählen

   KlasseA &ref = this->klasseA;
   return ref;
Falls das noch zu einem Problem wegen dem "const" führt (weiss ich nicht gerade auswendig), kannst du
a) die Membervariabel "klasseA" nach "KlasseA" casten, oder
b) das "const" bei der "getKlasseA"-Methode weglassen...
Aber das hat nichts mit Qt zu tun, sondern mit C++ (gehört also nach "C++ Grundlagen).

Verfasst: 20. Oktober 2008 10:26
von Tom_Tom
Ok danke dir.
Das mit const weglassen geht nicht wegen des QDataStreams.

Aber jetzt läufts. Danke nochmal.

Verfasst: 12. November 2008 11:13
von RHBaum
KlasseA& KlasseB::getKlasseA() const oder
KlasseA* KlasseB::getKlasseA() const
Wenn ich das so mache, wie du es auch gesagt hast, sagt mein Compiler:
const KlasseA' kann nicht in 'KlasseA &' konvertiert werden.
Genau da sagt dir dein compiler, das da ziemliche ungereimtheiten auftreten.

Wenn B der Verwalter von Instanz(en) der Klasse A ist, dann sollte eine Methode niemals eine nichtkonstante referenz auf ein verwaltetes Objekt rausgeben, wenn die methode selber const ist !

also besser:

Code: Alles auswählen

const KlasseA& KlasseB::getKlasseA() const
KlasseA& KlasseB::getKlasseA()
Implementieren.

Dann spart man sich den mega schmutzigen const_cast ...

und man wird gezwungen weiterhin const correct zu arbeiten und hat es nicht schon bei dem getter ausgehebelt !

Ciao ...