Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QDataStream serialze & deserialize 'myclass' pointer
Forum Updated to NodeBB v4.3 + New Features

QDataStream serialze & deserialize 'myclass' pointer

Scheduled Pinned Locked Moved Solved General and Desktop
24 Posts 4 Posters 8.9k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • B bludger

    Hi,

    Your main issue is that the pointer passed to your stream operator is uninitialized.
    Thereby the stream operator should have another signature:

    QDataStream& operator>>(QDataStream& in, myclasss *& obj);
    

    Note that the second parameter is a reference to a pointer. We need this in order to do the following:

    QDataStream& operator>>(QDataStream& in, myclass*& obj) {
      obj = new myclass(); // pointer now correctly initialized 
      in >> obj->property;
      return in;
    }
    

    This should fix it.

    Taz742T Offline
    Taz742T Offline
    Taz742
    wrote on last edited by Taz742
    #3

    @bludger hm... i am stupid? :d
    many thank friend, its fixed :)

    Do what you want.

    1 Reply Last reply
    0
    • VRoninV Offline
      VRoninV Offline
      VRonin
      wrote on last edited by
      #4

      You are leaking memory like a bandit here.

      QList<myclass> here instead of QVector<myclass*> is as efficient, less prone to memory leaks and doesn't require you to hack operator>> and operator<< for pointers type

      "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
      ~Napoleon Bonaparte

      On a crusade to banish setIndexWidget() from the holy land of Qt

      Taz742T 1 Reply Last reply
      0
      • VRoninV VRonin

        You are leaking memory like a bandit here.

        QList<myclass> here instead of QVector<myclass*> is as efficient, less prone to memory leaks and doesn't require you to hack operator>> and operator<< for pointers type

        Taz742T Offline
        Taz742T Offline
        Taz742
        wrote on last edited by
        #5

        @VRonin waitttt. If I use QList, I will not have to teach DataStream how to arrange my class?

        Do what you want.

        1 Reply Last reply
        0
        • VRoninV Offline
          VRoninV Offline
          VRonin
          wrote on last edited by VRonin
          #6

          yes but you wouldn't have to hack your way through it. You'd implement QDataStream & operator << (QDataStream &stream, const myclass& cls) and QDataStream & operator >> (QDataStream &stream, myclass& cls)
          QList doesn't require a copy of the elements when it grows in size

          "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
          ~Napoleon Bonaparte

          On a crusade to banish setIndexWidget() from the holy land of Qt

          Taz742T 1 Reply Last reply
          0
          • VRoninV VRonin

            yes but you wouldn't have to hack your way through it. You'd implement QDataStream & operator << (QDataStream &stream, const myclass& cls) and QDataStream & operator >> (QDataStream &stream, myclass& cls)
            QList doesn't require a copy of the elements when it grows in size

            Taz742T Offline
            Taz742T Offline
            Taz742
            wrote on last edited by
            #7

            @VRonin I still use std :: vector <T> when I write programmatic tasks.
            It's so deeply in my subconscious that I'm not trying to see what QList gives me better than QVector.

            Do what you want.

            1 Reply Last reply
            0
            • VRoninV Offline
              VRoninV Offline
              VRonin
              wrote on last edited by VRonin
              #8

              you can imagine both QVector<T>(n) and std::vector<T>(n) as wrappers around T* vec = new T[n] while QList<T>(n) can be imagined as a wrapper around T** vec=new T*[n]; for(int i=0;i<n;++i) vec[i] = new T;

              Now imagine inserting an item in the middle in those 2 cases.

              That's why the docs suggests using QVector for types that are Q_MOVABLE_TYPE (the name can be misleading, see Q_DECLARE_TYPEINFO) and QList for the others

              QVector<myclass*> containing heap allocated objects that QVector (should) own is, in practice, the same as QList<myclass>

              "La mort n'est rien, mais vivre vaincu et sans gloire, c'est mourir tous les jours"
              ~Napoleon Bonaparte

              On a crusade to banish setIndexWidget() from the holy land of Qt

              Taz742T 1 Reply Last reply
              4
              • VRoninV VRonin

                you can imagine both QVector<T>(n) and std::vector<T>(n) as wrappers around T* vec = new T[n] while QList<T>(n) can be imagined as a wrapper around T** vec=new T*[n]; for(int i=0;i<n;++i) vec[i] = new T;

                Now imagine inserting an item in the middle in those 2 cases.

                That's why the docs suggests using QVector for types that are Q_MOVABLE_TYPE (the name can be misleading, see Q_DECLARE_TYPEINFO) and QList for the others

                QVector<myclass*> containing heap allocated objects that QVector (should) own is, in practice, the same as QList<myclass>

                Taz742T Offline
                Taz742T Offline
                Taz742
                wrote on last edited by Taz742
                #9

                @VRonin Do you mean this?

                       if (query.exec()) {
                            QList<Contact> *_list = new QList<Contact>();
                            while (query.next()) {
                                _list->push_back(Contact(query.value("UID").toInt(),
                                                         query.value("USERNAME").toString(),
                                                         query.value("MOBILE").toString(),
                                                         )
                                                 );
                            }
                
                            qDebug() << _list->size();
                
                            QByteArray bytes;
                            QDataStream stream(&bytes, QIODevice::WriteOnly);
                            stream << sSelecAllContacts << _list;
                            globalall->modify(bytes);
                            socket->write(bytes);
                        }
                

                I have just one pointer now?

                Do what you want.

                kshegunovK 1 Reply Last reply
                0
                • Taz742T Taz742

                  @VRonin Do you mean this?

                         if (query.exec()) {
                              QList<Contact> *_list = new QList<Contact>();
                              while (query.next()) {
                                  _list->push_back(Contact(query.value("UID").toInt(),
                                                           query.value("USERNAME").toString(),
                                                           query.value("MOBILE").toString(),
                                                           )
                                                   );
                              }
                  
                              qDebug() << _list->size();
                  
                              QByteArray bytes;
                              QDataStream stream(&bytes, QIODevice::WriteOnly);
                              stream << sSelecAllContacts << _list;
                              globalall->modify(bytes);
                              socket->write(bytes);
                          }
                  

                  I have just one pointer now?

                  kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by
                  #10

                  @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                  @VRonin Do you mean this?

                  No. He means this:

                  QList<Contact> _list;
                  while (query.next()) {
                      _list.push_back(Contact(query.value("UID").toInt(),
                          query.value("USERNAME").toString(),
                          query.value("MOBILE").toString(),
                      ));
                  }
                  

                  There is no gain at all in creating a Qt container in the heap.

                  Read and abide by the Qt Code of Conduct

                  Taz742T 1 Reply Last reply
                  1
                  • kshegunovK kshegunov

                    @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                    @VRonin Do you mean this?

                    No. He means this:

                    QList<Contact> _list;
                    while (query.next()) {
                        _list.push_back(Contact(query.value("UID").toInt(),
                            query.value("USERNAME").toString(),
                            query.value("MOBILE").toString(),
                        ));
                    }
                    

                    There is no gain at all in creating a Qt container in the heap.

                    Taz742T Offline
                    Taz742T Offline
                    Taz742
                    wrote on last edited by Taz742
                    #11

                    @kshegunov
                    Well, let's consider this case.
                    What I wrote this is the server side.

                    When I get it to the client side, if I get the same kind of list and get the value from it.
                    for example:

                        QList<faf> list;
                    
                        list.push_back(faf(2, 13));
                        list.push_back(faf(15, 23));
                        list.push_back(faf(30, 46));
                    
                        faf test = list[0];
                        test.x = test.x * 2;
                        test.y = test.y * 2;
                    
                        for (int i = 0; i < list.size(); i++) {
                            qDebug() << list[i].x << list[i].y; //Prints the same values
                        }
                    
                    
                    

                    If I want the object to change in the list.
                    Is it right?

                        QList<faf> list;
                    
                        list.push_back(faf(2, 13));
                        list.push_back(faf(15, 23));
                        list.push_back(faf(30, 46));
                    
                        faf *test = &list[0];
                        test->x = test->x * 2;
                        test->y = test->y * 2;
                    
                        for (int i = 0; i < list.size(); i++) {
                            qDebug() << list[i].x << list[i].y; //list[0].x = 4 and list[0].y = 46;
                        }
                    

                    Do what you want.

                    kshegunovK 1 Reply Last reply
                    0
                    • Taz742T Taz742

                      @kshegunov
                      Well, let's consider this case.
                      What I wrote this is the server side.

                      When I get it to the client side, if I get the same kind of list and get the value from it.
                      for example:

                          QList<faf> list;
                      
                          list.push_back(faf(2, 13));
                          list.push_back(faf(15, 23));
                          list.push_back(faf(30, 46));
                      
                          faf test = list[0];
                          test.x = test.x * 2;
                          test.y = test.y * 2;
                      
                          for (int i = 0; i < list.size(); i++) {
                              qDebug() << list[i].x << list[i].y; //Prints the same values
                          }
                      
                      
                      

                      If I want the object to change in the list.
                      Is it right?

                          QList<faf> list;
                      
                          list.push_back(faf(2, 13));
                          list.push_back(faf(15, 23));
                          list.push_back(faf(30, 46));
                      
                          faf *test = &list[0];
                          test->x = test->x * 2;
                          test->y = test->y * 2;
                      
                          for (int i = 0; i < list.size(); i++) {
                              qDebug() << list[i].x << list[i].y; //list[0].x = 4 and list[0].y = 46;
                          }
                      
                      kshegunovK Offline
                      kshegunovK Offline
                      kshegunov
                      Moderators
                      wrote on last edited by
                      #12

                      @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                      // Prints the same values
                      

                      Of course it does, you're copying the object that's stored in the list and modifying the copy.

                      If I want the object to change in the list.

                      Why convert to pointers? Just use references:

                      faf & test = list[0];
                      test.x *= 2;
                      test.y *= 2;
                      

                      Read and abide by the Qt Code of Conduct

                      Taz742T 1 Reply Last reply
                      2
                      • kshegunovK kshegunov

                        @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                        // Prints the same values
                        

                        Of course it does, you're copying the object that's stored in the list and modifying the copy.

                        If I want the object to change in the list.

                        Why convert to pointers? Just use references:

                        faf & test = list[0];
                        test.x *= 2;
                        test.y *= 2;
                        
                        Taz742T Offline
                        Taz742T Offline
                        Taz742
                        wrote on last edited by Taz742
                        #13

                        @kshegunov good :))

                        Now there are new problems.
                        Recently everything was good.
                        I do not know what happened to me or why.

                        alt text

                        C:\Users\User\Desktop\tazsmsorigin\enumeration.h:69: error: no match for 'operator>>' (operand types are 'QDataStream' and 'qint32 {aka int}')
                             stream >> tempint; _class.UID = tempint;
                                    ^
                        C:\Users\User\Desktop\tazsmsorigin\enumeration.h:50: error: ambiguous overload for 'operator<<' (operand types are 'QDataStream' and 'int')
                             stream  << static_cast<qint32>(_class.UID)
                                     ^
                        C:\Users\User\Desktop\tazsmsorigin\enumeration.h:46: error: no match for 'operator>>' (operand types are 'QDataStream' and 'bool')
                             return stream >> _class.TChecked >> _class.Message;
                                           ^
                        

                        Do what you want.

                        kshegunovK 1 Reply Last reply
                        0
                        • Taz742T Taz742

                          @kshegunov good :))

                          Now there are new problems.
                          Recently everything was good.
                          I do not know what happened to me or why.

                          alt text

                          C:\Users\User\Desktop\tazsmsorigin\enumeration.h:69: error: no match for 'operator>>' (operand types are 'QDataStream' and 'qint32 {aka int}')
                               stream >> tempint; _class.UID = tempint;
                                      ^
                          C:\Users\User\Desktop\tazsmsorigin\enumeration.h:50: error: ambiguous overload for 'operator<<' (operand types are 'QDataStream' and 'int')
                               stream  << static_cast<qint32>(_class.UID)
                                       ^
                          C:\Users\User\Desktop\tazsmsorigin\enumeration.h:46: error: no match for 'operator>>' (operand types are 'QDataStream' and 'bool')
                               return stream >> _class.TChecked >> _class.Message;
                                             ^
                          
                          kshegunovK Offline
                          kshegunovK Offline
                          kshegunov
                          Moderators
                          wrote on last edited by
                          #14

                          Did you forget to include the <QDataStream> header?

                          Read and abide by the Qt Code of Conduct

                          Taz742T 1 Reply Last reply
                          1
                          • kshegunovK kshegunov

                            Did you forget to include the <QDataStream> header?

                            Taz742T Offline
                            Taz742T Offline
                            Taz742
                            wrote on last edited by
                            #15

                            @kshegunov no. I have

                            Do what you want.

                            kshegunovK 1 Reply Last reply
                            0
                            • Taz742T Taz742

                              @kshegunov no. I have

                              kshegunovK Offline
                              kshegunovK Offline
                              kshegunov
                              Moderators
                              wrote on last edited by
                              #16

                              Then you need to follow the compiler errors, it has given you exact directions where the errors are:
                              C:\Users\User\Desktop\tazsmsorigin\enumeration.h @ line 69

                              error: no match for 'operator>>' (operand types are 'QDataStream' and 'qint32 {aka int}')

                              I'm pretty sure this comes from not including the header. Also there's something amiss, it should be QDataStream & not QDataStream. Please post what's on line 69 in enumeration.h.

                              Read and abide by the Qt Code of Conduct

                              Taz742T 1 Reply Last reply
                              2
                              • kshegunovK kshegunov

                                Then you need to follow the compiler errors, it has given you exact directions where the errors are:
                                C:\Users\User\Desktop\tazsmsorigin\enumeration.h @ line 69

                                error: no match for 'operator>>' (operand types are 'QDataStream' and 'qint32 {aka int}')

                                I'm pretty sure this comes from not including the header. Also there's something amiss, it should be QDataStream & not QDataStream. Please post what's on line 69 in enumeration.h.

                                Taz742T Offline
                                Taz742T Offline
                                Taz742
                                wrote on last edited by Taz742
                                #17

                                @kshegunov
                                Yes the library was nat included, but I had it in globaldefines.h file.
                                He has caused a redifination proxy, QDataStream also has been described in MySocket.h file.

                                Do what you want.

                                kshegunovK 1 Reply Last reply
                                0
                                • Taz742T Taz742

                                  @kshegunov
                                  Yes the library was nat included, but I had it in globaldefines.h file.
                                  He has caused a redifination proxy, QDataStream also has been described in MySocket.h file.

                                  kshegunovK Offline
                                  kshegunovK Offline
                                  kshegunov
                                  Moderators
                                  wrote on last edited by
                                  #18

                                  @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                                  He has caused a redifination proxy, QDataStream also has been described in MySocket.h file.

                                  I don't follow.

                                  Read and abide by the Qt Code of Conduct

                                  Taz742T 2 Replies Last reply
                                  0
                                  • kshegunovK kshegunov

                                    @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                                    He has caused a redifination proxy, QDataStream also has been described in MySocket.h file.

                                    I don't follow.

                                    Taz742T Offline
                                    Taz742T Offline
                                    Taz742
                                    wrote on last edited by
                                    #19

                                    @kshegunov I had code again mysocket.h, I taught at different places how to deal with my classes.

                                    Do what you want.

                                    1 Reply Last reply
                                    0
                                    • kshegunovK kshegunov

                                      @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                                      He has caused a redifination proxy, QDataStream also has been described in MySocket.h file.

                                      I don't follow.

                                      Taz742T Offline
                                      Taz742T Offline
                                      Taz742
                                      wrote on last edited by Taz742
                                      #20

                                      @kshegunov @VRonin
                                      How to handle QDataStream to my classes, this are stored in one 'header' file.
                                      It's uncomfortable for me because I have many issues.
                                      I learnt to my classes QDataStream >> and << operators.

                                      For Example:

                                      #ifndef POINT3D_H
                                      #define POINT3D_H
                                      
                                      #include "QObject"
                                      #include "QDataStream"
                                      
                                      class Point3D
                                      {
                                      public:
                                          Point3D();
                                          int x;
                                          int y;
                                          int z;
                                      
                                          Point3D(int _x, int _y, int _z) {
                                              this->x = _x;
                                              this->y = _y;
                                              this->z = _z;
                                          }
                                      
                                          friend QDataStream & operator << (QDataStream &stream, const Point3D &obj);
                                          friend QDataStream & operator >> (QDataStream &stream, Point3D &obj);
                                      };
                                      
                                      Q_DECLARE_TYPEINFO(Point3D, Q_MOVABLE_TYPE);
                                      
                                      #endif // POINT3D_H
                                      
                                      #include "point3d.h"
                                      
                                      Point3D::Point3D()
                                      {
                                      
                                      }
                                      
                                      QDataStream & operator << (QDataStream &stream, const Point3D &obj) {
                                          stream << static_cast<qint32>(obj.x) << static_cast<qint32>(obj.y) << static_cast<qint32>(obj.z);
                                          return stream;
                                      }
                                      
                                      QDataStream & operator >> (QDataStream &stream, Point3D &obj) {
                                          qint32 tempint;
                                          stream >> tempint; obj.x = static_cast<int>(tempint);
                                          stream >> tempint; obj.y = static_cast<int>(tempint);
                                          stream >> tempint; obj.z = static_cast<int>(tempint);
                                      
                                          return stream;
                                      }
                                      

                                      I want to be sure that this will work from anywhere. Can you confirm it?

                                      Do what you want.

                                      kshegunovK 1 Reply Last reply
                                      0
                                      • Taz742T Taz742

                                        @kshegunov @VRonin
                                        How to handle QDataStream to my classes, this are stored in one 'header' file.
                                        It's uncomfortable for me because I have many issues.
                                        I learnt to my classes QDataStream >> and << operators.

                                        For Example:

                                        #ifndef POINT3D_H
                                        #define POINT3D_H
                                        
                                        #include "QObject"
                                        #include "QDataStream"
                                        
                                        class Point3D
                                        {
                                        public:
                                            Point3D();
                                            int x;
                                            int y;
                                            int z;
                                        
                                            Point3D(int _x, int _y, int _z) {
                                                this->x = _x;
                                                this->y = _y;
                                                this->z = _z;
                                            }
                                        
                                            friend QDataStream & operator << (QDataStream &stream, const Point3D &obj);
                                            friend QDataStream & operator >> (QDataStream &stream, Point3D &obj);
                                        };
                                        
                                        Q_DECLARE_TYPEINFO(Point3D, Q_MOVABLE_TYPE);
                                        
                                        #endif // POINT3D_H
                                        
                                        #include "point3d.h"
                                        
                                        Point3D::Point3D()
                                        {
                                        
                                        }
                                        
                                        QDataStream & operator << (QDataStream &stream, const Point3D &obj) {
                                            stream << static_cast<qint32>(obj.x) << static_cast<qint32>(obj.y) << static_cast<qint32>(obj.z);
                                            return stream;
                                        }
                                        
                                        QDataStream & operator >> (QDataStream &stream, Point3D &obj) {
                                            qint32 tempint;
                                            stream >> tempint; obj.x = static_cast<int>(tempint);
                                            stream >> tempint; obj.y = static_cast<int>(tempint);
                                            stream >> tempint; obj.z = static_cast<int>(tempint);
                                        
                                            return stream;
                                        }
                                        

                                        I want to be sure that this will work from anywhere. Can you confirm it?

                                        kshegunovK Offline
                                        kshegunovK Offline
                                        kshegunov
                                        Moderators
                                        wrote on last edited by
                                        #21

                                        @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                                        I want to be sure that this will work from anywhere. Can you confirm it?

                                        I don't understand the question, could you elaborate.

                                        Read and abide by the Qt Code of Conduct

                                        Taz742T 1 Reply Last reply
                                        0
                                        • kshegunovK kshegunov

                                          @Taz742 said in QDataStream serialze & deserialize 'myclass' pointer:

                                          I want to be sure that this will work from anywhere. Can you confirm it?

                                          I don't understand the question, could you elaborate.

                                          Taz742T Offline
                                          Taz742T Offline
                                          Taz742
                                          wrote on last edited by
                                          #22

                                          @kshegunov said in QDataStream serialze & deserialize 'myclass' pointer:

                                          I don't understand the question, could you elaborate.

                                          I have class Point3D which know how to behave when datastream requires input(<<) or output(>>) operators.
                                          I want to know if it will works from anyclasses, for example: from mainwindows and etc..

                                          Do what you want.

                                          kshegunovK 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved