Seite 1 von 1

[SOLVED] QDataStream nicht kopierbar, aber ich will ihn ....

Verfasst: 2. Januar 2009 20:00
von PhilippM
Servus,

sorry für den kryptischen Titel. Problem ist, das der Kopierkonstruktor von QDataStream privat ist, also ein QDataStream (verständlicherweise!) nicht kopierbar ist. Nun will ich ihn auch nicht kopieren, ich will ihn erzeugen und zurückgeben...

Aber mal mit Code, dann wirds verständlicher. Ich habe ein Klasse die mir den zugriff auf ein UDP-Device kapselt und aus selbigem Datenpakete rausprokelt auf die ich mit einem QDataStream zugreifen will.

Code: Alles auswählen

class DataStreamOverUDP  {
 public:
    bool readFromSocket();           // hier wird das socketdevice auf pakets abgefragt und selbige eingelesen
    QDataStream InStream();        // hier möchte ich einen datastream auf den eingelesenen buffer ausgeben
    void configureInput(const Config&); // hier wird das binden auf port und adresse usw gemacht
  private:
    QHostAddress m_read_hostaddress;
    int m_read_port;
    QUdpSocket* m_read_socketdevice;
    QByteArray m_inBuffer;
};

bool DataStreamOverUDP::readFromSocket()
{ 
    //socketdevice auf wartende datagrams fragen, buffer resizen, datagrams in den buffer einlesen
}

QDataStream DataStreamOverUDP::InStream()
{
    return QDataStream(&m_inBuffer, QIODevice::ReadOnly);
}
Und in dieser letzten Zeile ist das Problem: Ich möchte den Stream haben, damit ich ihn außerhalb meiner Klasse auseinanderprokeln kann.
Also sowas wie

Code: Alles auswählen

DataStreamOverUDP myUdpConnection();
// notwendige initialisierungen
myUdpConnection.readFromSocket();
QDataStream myInputStream = myUdpConnection.inStream();
inStream >> blablablabla;
Das wird mir verweigert mit dem Hinweis, dass
‘QDataStream::QDataStream(const QDataStream&)’ is private
Aber ich will doch garnix kopieren, sondern das Objekt haben!

EDIT: Warum gibt's hier keine cpp-Code-Tags ?? Das ist ja ne Qual ohne Syntaxhervorhebung!

Verfasst: 2. Januar 2009 20:13
von Christian81
Natürlich passiert hier ne Copy:

Code: Alles auswählen

QDataStream myInputStream = myUdpConnection.inStream(); 

Verfasst: 2. Januar 2009 20:17
von PhilippM
Christian81 hat geschrieben:Natürlich passiert hier ne Copy:

Code: Alles auswählen

QDataStream myInputStream = myUdpConnection.inStream(); 
okay, aber diese Zeile Code steht nicht in meinem Code, die hab ich nur fürs Forum eingefügt. Die Kompilierung scheitert bereits beim kompilieren der Klasse.

Entschuldigung, ich formuliere meine Frage anders:
Der Compiler hält mich hier also davon ab, das zu tun, weil es eh keinen Sinn machen würde, wenn ich die Funktion so verwenden würde wie im Zitat. Okay, das ist nett vom Compiler.

Also was hab ich für Möglichkeiten? Den Stream als Membervariable erzeugen und einen pointer darauf zurückgeben? Das widerstrebt mir irgendwie.

Verfasst: 2. Januar 2009 20:24
von Christian81
Es gibt auch noch Referenzen - C++ Basics

Verfasst: 22. Januar 2009 18:28
von PhilippM
[SOLVED]

Klaro. Mit QDataStream& geht's...