Seite 1 von 1

[gelöst] QDataStream Problem

Verfasst: 8. Oktober 2008 09:54
von Tom_Tom
Hallo, ich bekomme immer folgende Fehlermeldunge:

C2248: "QObject::operator =": Kein Zugriff auf private Member, dessen Deklaration in der QObject-Klasse erfolgte.

Mein Code-Ausschnitt worin der Fehler verursacht wird.


LoginRequest - Header

Code: Alles auswählen



#ifndef LOGINREQUEST_H_
#define LOGINREQUEST_H_

#include <Qt/qobject.h>
#include <QtCore/QDataStream>
class LoginRequest : public QObject
{
	Q_OBJECT
	
	QString user;

public:
	LoginRequest(QObject* parent = 0);
	virtual ~LoginRequest();


	void setUser(QString user);
	QString getUser();

};	
QDataStream& operator<<(QDataStream & dataStream, LoginRequest & loginRequest);
QDataStream& operator>>(QDataStream & dataStream, LoginRequest & loginRequest);
#endif


LoginRequest - Source

Code: Alles auswählen


#include "LoginRequest.h"


LoginRequest::LoginRequest(QObject* parent) : QObject(parent)
{
	
}


LoginRequest::~LoginRequest()
{
}

void LoginRequest::setUser(QString user) {
	//this->user = user;
}

QString LoginRequest::getUser() {
	//return this->user;
	return 0;
}



QDataStream& operator<<(QDataStream & dataStream, LoginRequest & loginRequest)
{
	QString user = loginRequest.getUser();
	dataStream << user;
	
	return dataStream;
}

QDataStream& operator>>(QDataStream & dataStream, LoginRequest & loginRequest)
{
	QString user;
	dataStream >> user;
	loginRequest.setUser(user);
	return dataStream;
}

RequestPackage - Header

Code: Alles auswählen


#ifndef REQUESTPACKAGE_H_
#define REQUESTPACKAGE_H_

#include <Qt/qobject.h>
#include "LoginRequest.h"
class RequestPackage : public QObject
{
	Q_OBJECT

	int Type;
	LoginRequest loginRequest;


public:
	enum TYPE {LOGIN, DBQUERY};

	RequestPackage(QObject* parent = 0);
	RequestPackage(TYPE type, QObject* parent = 0);
	virtual ~RequestPackage();

	//return the Request-Type (show enum-List)
	int getType();
	
	//set the Request-Type (show enum-List)
	void setType(int type);

	LoginRequest getLoginRequest();
	void setLoginRequest(LoginRequest loginRequest);


	friend QDataStream &operator<<(QDataStream & dataStream, RequestPackage & requestPackage);
	friend QDataStream &operator>>(QDataStream & dataStream, RequestPackage & requestPackage);

};

#endif

RequestPackage - Source

Code: Alles auswählen


#include "RequestPackage.h"
#include "LoginRequest.h"


RequestPackage::RequestPackage(QObject* parent /*= 0*/ ) : QObject(parent)
{
}

RequestPackage::RequestPackage(TYPE type, QObject* parent /*= 0*/ ) : QObject(parent)
{
	//Type can be a value of enum-List
	this->Type = type;
	this->loginRequest = new LoginRequest();
}


RequestPackage::~RequestPackage()
{
}

//return the Request-Type (show enum-List)
int RequestPackage::getType() {
	return this->Type;
}

//set the Request-Type (show enum-List)
void RequestPackage::setType(int type) {
	this->Type = type;
}

LoginRequest RequestPackage::getLoginRequest() {
	return this->loginRequest;
}
void RequestPackage::setLoginRequest(LoginRequest loginRequest) {
	this->loginRequest = loginRequest;
}

//WRITE
QDataStream& operator<<(QDataStream & dataStream, RequestPackage & requestPackage)
{
	dataStream << requestPackage.getType();

	switch(requestPackage.getType())
	{
		//RequestPackage::LOGIN
	case RequestPackage::LOGIN:
		dataStream << requestPackage.getLoginRequest();
		break;

	}


	return dataStream;
}

//READ
QDataStream& operator>>(QDataStream & dataStream, RequestPackage & requestPackage)
{
	int wert;
	dataStream >> wert;
	requestPackage.setType(wert);

	switch(requestPackage.getType())
	{
		//RequestPackage::LOGIN
	case RequestPackage::LOGIN:
		LoginRequest loginRequest;
		dataStream >> loginRequest;
		requestPackage.setLoginRequest(loginRequest);
		break;

	}


	return dataStream;
}

Wäre schön, wenn mir jemand helfen könnte, mein Problem zu lösen.

Verfasst: 8. Oktober 2008 11:43
von Christian81
Wo genau der Fehler auftritt wäre ja auch noch nett...
Man kann ein QObject - Objekt nicht kopieren.

Verfasst: 8. Oktober 2008 11:51
von Tom_Tom
Habe den Fehler jetzt gefunden. Es lag nicht an DataStream.

Hier nochmal ein einfacheres Codebeispiel.

KlasseA.h

Code: Alles auswählen

#ifndef KLASSEA_H_
#define KLASSEA_H_

#include <Qt/qobject.h>

class KlasseA : public QObject
{
	Q_OBJECT
public:
	KlasseA(QObject* parent = 0);
	virtual ~KlasseA();
};
#endif
KlasseA.cpp

Code: Alles auswählen

#include "KlasseA.h"

KlasseA::KlasseA( QObject* parent /*= 0*/ ) : QObject(parent)
{
}

KlasseA::~KlasseA()
{
}
KlasseB.h

Code: Alles auswählen

#ifndef KLASSEB_H_
#define KLASSEB_H_

#include <Qt/qobject.h>
#include "KlasseA.h"

class KlasseB : public QObject
{
	Q_OBJECT

	KlasseA wert;

public:
	KlasseB(QObject* parent = 0);
	virtual ~KlasseB();

	void setWert(KlasseA wert);

};
#endif
KlasseB.cpp

Code: Alles auswählen

#include "KlasseB.h"

KlasseB::KlasseB( QObject* parent /*= 0*/ ) : QObject(parent)
{
}

KlasseB::~KlasseB()
{
}

void KlasseB::setWert(KlasseA wert) {
	this->wert = wert; //hier tritt der Fehler auf.
}
Warum funktioniert das so nicht? Was mache ich falsch oder was muss ich tun, damit es klappt?

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

Verfasst: 8. Oktober 2008 12:12
von Christian81
Ich habe schon erklärt warum es nicht funktioniert - du kannst eine QObject-basierte Klasse nicht kopieren. Dies tust Du an der Stelle dort aber mindestens zweimal.
Lösung ist entweder nicht von QObject ableiten oder einen Pointer benutzen.

Verfasst: 8. Oktober 2008 12:38
von Tom_Tom
Ok alles klar.

Danke erstmal.

Ich probier es mal.