Klassen-Serialisierungs-Problem

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Klassen-Serialisierungs-Problem

Beitrag 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.
Superheftig
Beiträge: 63
Registriert: 6. September 2008 15:20

Beitrag 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.
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag 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?
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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).
Tom_Tom
Beiträge: 54
Registriert: 2. August 2008 18:39

Beitrag von Tom_Tom »

Ok danke dir.
Das mit const weglassen geht nicht wegen des QDataStreams.

Aber jetzt läufts. Danke nochmal.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
Antworten