(gelöst) QT 4.5 Eigene Operator für QDataStream



  • Hi,

    hat jemand eine Info, wie man eine eigenen Operator für steaming über die Klasse "QDataStream" erstellt.

    Unter http://doc.trolltech.com/4.5/qdatastream.html#details

    konnte ich nur die bestehenden unterstützen Datentypen finden und ebenso ein Hinweis, wie man es für weitere QT Klassen macht, nicht jedoch, wie man es für seine eigene Klasse erstellt.

    Gruss



  • hm, wo liegt das Problem?

    Zwei "Non-Members" in dieser Form anlegen:

    QDataStream& operator<<(QDataStream &, const YourClass &);
    QDataStream& operator>>(QDataStream &, YourClass &);
    

    und dort entsprechend weiter verfahren... entweder in primitive Typen aufbrechen

    QDataStream& operator<<(QDataStream& stream, const YourClass& class)
    {
       stream << class.X() << class.Y();
       return stream;
    }
    

    oder direkt Binär schreiben/lesen

    QDataStream& operator<<(QDataStream& stream, const YourClass& class)
    {
       stream.writeRawData(class.constData(), class.lengthOfData());
       return stream;
    }
    


  • Danke für die tolle Antwort.

    Edit:

    So hier das Ergebnis.

    Ich habe hier jedoch das Problem, das ich beim Output "const" nicht einsetzen
    kann, da sonst die Meldung

    error: passing 'const DataBlock' as 'this' argument of 'QDateTime DataBlock::getStorageTime()' discards qualifiers
    error: passing 'const DataBlock' as 'this' argument of 'QString DataBlock::getDescription()' discards qualifiers
    error: passing 'const DataBlock' as 'this' argument of 'QByteArray DataBlock::getData()' discards qualifiers

    vom Compiler kommt ?!

    class DataBlock
    {
    ....
    };
    QDataStream& operator<<(QDataStream &, DataBlock &);
    QDataStream& operator>>(QDataStream &, DataBlock &);
    
    QDataStream& operator<<(QDataStream& stream, DataBlock& data)
    {
    	stream << data.getStorageTime() << data.getDescription() << data.getData();
    	return stream;
    }
    
    QDataStream& operator>>(QDataStream& stream,DataBlock& data)
    {
    	QDateTime		Temp1;
    	QString				Temp2;
    	QByteArray		Temp3;
    
    	stream >> Temp1 >> Temp2 >> Temp3;
    	data.setData(Temp3);
    	data.setDescription(Temp2);
    	data.setStorageTime(Temp1);
    	return stream;
    }
    

    Gebe ja zu, da ich hier das erstmal einen Operator überschreibe. 🙂
    Ist das den so jetzt korrekt oder kann man hier noch was besser machen.

    Bei der Input Routine bin ich mir nicht ganz so sicher, ob man das über Temp
    Variablen löst.
    Die eigentlichen Variablen sind aber privat und da habe ich kein Zugriff aus der
    Funktion drauf. Soll auch so bleiben.

    Gruss



  • Also, wenn der gepostete Code wirklich und wahrhaftig der aus deinem Projekt ist, liegt der Fehler nicht in den Operatoren 😉
    Fehler wie

    error: passing 'const DataBlock' as 'this' argument of 'QDateTime DataBlock::getStorageTime()' discards qualifiers
    

    sagen IMMER, dass die Methode nicht als const deklariert wurde und deshalb nicht für ein const-Objekt ausgerufen werden können!
    Gehen würde es wenn das in DataBlock so auschaut:

    class DataBlock {
        ...
    public:
        QDateTime getStorageTime() const; // <--- beachte das const am Schluss!
        ...
    };
    


  • Danke für den Tip

    nachdem ich

    QString	getDescription( void ) const;
    
    QString DataBlock::getDescription( void ) const
    {
    ....
    }
    

    für alle Funktionen verwendet habe, klappt es auch mit dem "Nachbarn".

    Ich habe das Const immer vorne geschrieben 🙂 .

    Gruss

    P.S.: Kaum macht man es richtig, schon funktioniert es.


Anmelden zum Antworten