IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Problème de sérialisation de QDataStream

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 58
    Par défaut Problème de sérialisation de QDataStream
    Bonjour à tous,


    Je me tourne vers vous en espérant résoudre un problème que je n'arrive pas à résoudre depuis quelques jours.

    Des amis et moi avons un projet sur Developpez, nous réalisons un jeu en C++.
    Et nous tentons de sauvegarder le compte de l'utilisateur, ainsi que ses personnages.
    C'est ici que nous nous retrouvons bloqué.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    void Save_load::load_Game_Test()
    {
        qDebug() << "Chargement";
        QFile f("Sauvegarde.bin");
     
        if(!f.exists())
        {
            qDebug() << "Erreur : fichier inexistant";
        }
        else
        {
            qDebug() << "Fichier existe";
            f.open(QIODevice::ReadOnly);
     
            QDataStream binStream(&f);
            // On spécifie la version de l'encodage qui va être utilisé par notre objet QDataStream
            binStream.setVersion(QDataStream::Qt_4_4);
     
            // On écrit nos differents objet dans le fichier
            Compte *compte = new Compte;
            binStream >> compte;
     
            f.close();
        }
    }
    void Save_load::save_Game(Compte compte)
    {
        qDebug() << "Sauvegarde";
        QFile file("Sauvegarde.bin");
        // Ouverture du fichier en écriture seule
        if (!file.open(QIODevice::WriteOnly))
            return;
        // Création de notre QDataStream à partir de notre fichier précédemment ouvert
        QDataStream binStream(&file);
        // On spécifie la version de l'encodage qui va être utilisé par notre objet QDataStream
        binStream.setVersion(QDataStream::Qt_4_4);
        // On écrit nos differents objet dans le fichier
        binStream << compte;
        // On ferme le fichier
        file.close();
    }
    Après quelques tests, il s'avère que le code fonctionne très bien, pour des objets Qt. Mais cet objet est une instance d'une classe créée par nous-même.
    Pourtant, les opérateurs d'injections ont été surchargé.

    Dans Compte.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    QDataStream& operator << (QDataStream& out, Compte& compte)
    {
        out << compte.getUsername(); // le username est un QString
        out << compte.getPassword(); // le password aussi
        return out;
    }
    QDataStream& operator >> (QDataStream& in, Compte& compte)
    {
        QString temp;
        in >> temp;
        compte.setUsername(temp);
        in >> temp;
        compte.setPassword(temp);
        return in;
    }
    Dans Compte.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        friend QDataStream& operator << (QDataStream&, const Compte&);
        friend QDataStream& operator >> (QDataStream&, Compte&);
    Je vous remercie d'avance pour votre aide précieuse.

    shini86161.

  2. #2
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 58
    Par défaut Message d'erreur
    J'ai oublié une chose, le message d'erreur.

    Donc, le voici :

    no match for 'operator>>' in 'binStream >> compte'
    Merci d'avance.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonsoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Compte *compte = new Compte;
    binStream >> compte;
    compte est du type Compte* donc le compilateur recherche l'opérateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QDataStream& operator >> (QDataStream& in, Compte* compte)
    qui n'existe pas. Il faut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Compte *compte = new Compte;
    binStream >> *compte;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Compte compte;
    binStream >> compte;

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 58
    Par défaut
    Bonjour à toi, et merci pour ta réponse.

    C'est que nos enseignants nous ont toujours dit qu'il fallait mettre un référent dans la redéfinition de l'opérateur d'injection, et qu'ici, c'est normal que ça ne fonctionne pas.

    J'ai testé tes solutions, et par magie, le programme tourne, mais n'écrit rien.
    Donc, voici un état des lieux, pour mieux savoir ce qui se passe.

    Dans le fichier Compte.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    friend QDataStream& operator << (QDataStream&, const Compte&);
    friend QDataStream& operator >> (QDataStream&, Compte&);
    Dans le fichier Save_load.cpp (ces deux méthodes sont des méthodes statiques):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Save_load::save_Game_Test(Compte *compte)
    {
        qDebug() << "Sauvegarde";
        QFile file("Sauvegarde.bin");
        if (!file.open(QIODevice::WriteOnly))
            return;
        QDataStream binStream(&file);
        binStream.setVersion(QDataStream::Qt_4_4);
        binStream << compte;
        file.close();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void Save_load::load_Game_Test(Compte *compte)
    {
        qDebug() << "Chargement";
        QFile f("Sauvegarde.bin");
     
        if(!f.exists())
        {
            qDebug() << "Erreur : fichier inexistant";
        }
        else
        {
            qDebug() << "Fichier existe";
            f.open(QIODevice::ReadOnly);
     
            QDataStream binStream(&f);
            binStream.setVersion(QDataStream::Qt_4_4);
            binStream >> *compte;
            // savoir si l'objet est vide ou non, et ça renvoie "" alors que ça ne devrait pas.
            qDebug() << compte->getUsername();
            qDebug() << compte->getPassword();
     
            f.close();
        }
    }
    Je me rends bien compte que c'est bizarre. Il attend des référents, il a un pointeur. Sinon, j'ai des erreurs "no match", ou "collect2: Id returned 1 exit status".

    Merci encore.

    shini86161.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Ok, un conseil, arrête avec les pointeurs, tu fais n'importe quoi avec.

    Tu as modifié ta fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Save_load::save_Game(Compte compte)
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Save_load::save_Game_Test(Compte *compte)
    alors que je t'ai jamais dit qu'elle posait problème. Résultat, ça ne fonctionne plus.

    Donc :
    - tu vires tous tes pointeurs de ton code (tu en as pas besoin)
    - tu utilises une référence pour le passage de paramètre : constante si le paramètre n'est pas modifié par la fonction, non constante si le paramètre est modifié.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Save_load::save_Game_Test(const Compte& compte) // compte n'est pas modifié = référence constante
    void Save_load::load_Game_Test(Compte& compte) // compte est modifié = référence non constante

    Donc règle générale : tu n'utilises pas de pointeurs sauf si tu as une bonne raison

    Ensuite, relis un cours ou la FAQ C++ pour comprendre ce que sont les références (et pas référant) et les pointeurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Tableaux] Problème de sérialisation
    Par Langly dans le forum Langage
    Réponses: 1
    Dernier message: 29/12/2006, 20h22
  2. [Débutant] Problème de sérialisation collection
    Par Michel Hubert dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 21/12/2006, 15h17
  3. problème de sérialisation
    Par yoyomc dans le forum Langage
    Réponses: 5
    Dernier message: 17/12/2006, 23h02
  4. Réponses: 4
    Dernier message: 12/12/2006, 10h22
  5. Problème de sérialisation
    Par CheryBen dans le forum Entrée/Sortie
    Réponses: 18
    Dernier message: 15/09/2005, 11h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo