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

C++ Discussion :

Polymorphie et Erreur de segmentation


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut Polymorphie et Erreur de segmentation
    Bonjour, j'ai des problèmes avec une fonction virtual que je redéfinit, mais qui provoque un seg fault à l'exécution.

    En faisant des recherches, j'ai trouvé ce post là

    Ce qui semble être mon problème... j'ai donc mis ma fonction en virtuel pure, histoire que le compilateur m'indique l'erreur, mais tout ce qu'il me dit c'est ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    build/albumindex.o:(.rodata._ZTI10AlbumIndex[typeinfo for AlbumIndex]+0x8): undefined reference to `typeinfo for IHttpCommunication'
    Ce que je ne comprend pas. et n'arrive pas à corriger, de plus je n'ai pas compris les expliquations de swoog, donc je repose à nouveau la question...

    Voici mon code :
    j'ai un objet HttpCommunicator, qui peut communiquer avec mon site internet, les objets de mon appli qui veulent l'utiliser, doivent implémenter l'interface IHttpCommunication
    Dés lors, quand ils voudront communiquer, il passeront par mon objet HttpCommunicator, qui stocke un pointeur vers l'objet qui fait une requete, afin qu'il le prévienne quand la communication est terminée.

    Voici le code :
    Code c++ : 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
    // L'interface que doivent implémenter tout les objets qui veulent utiliser le HttpCommunicator
    class IHttpCommunication
    {
    public :
        virtual void httpCommunicationDone(bool error) = 0;
    };
     
     
     
     
    // Le singleton HttpCommunicator, qui communique avec mon site
    class HttpCommunicator : public QObject
    {
    Q_OBJECT
     
    // Singleton
    private:
        HttpCommunicator(QObject * parent = 0);
        HttpCommunicator( const HttpCommunicator & ); 
        HttpCommunicator & operator =( const HttpCommunicator & ); 
     
     
    public :
        static HttpCommunicator & GetInstance();
        void startHttpCommunication(IHttpCommunication * client, QString url, QFile * httpResponse);
     
     
    public slots:
        void saveHttpResponse(int processKey, bool error);
     
     
    private:
        QHttp * http;
        QHash<int, IHttpCommunication *> communicationsStack;
    };


    le cpp
    Code c++ : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    HttpCommunicator::HttpCommunicator(QObject * parent) : QObject ( parent )
    {
        http = new QHttp();
        communicationsStack = QHash<int, IHttpCommunication *>() ;
     
     
        // Handle signals
        connect(http, SIGNAL(requestFinished(int, bool )), this, SLOT(saveHttpResponse(int, bool )));
     
        http->setHost(ABS3G_HOST);
    }
     
     
     
    /**
     * Retourne l'instance du singleton HttpCommuicator.
     * @return HttpCommunicator &
     */
    HttpCommunicator & HttpCommunicator::GetInstance()
    {
        static HttpCommunicator instance;
        return instance;
    }
     
     
    /**
     * Cette méthode est appelé par les Objets qui veulent communiquer avec le site (ces
     * objets doivent implémenter IHttpCommunication et fournir un pointeur vers eux-même).
     * Le HttpCommunicator se charge de transmettre le message
     */
    void HttpCommunicator::startHttpCommunication(IHttpCommunication * client, QString url, QFile * httpResponse)
    {
        // lancer la requete http (stocker la réponse dans le fichier fournis)
        int processKey = http->get(url, httpResponse);
     
     
        // Stocker id communication pour pouvoir prévenir l'objet quand elle sera terminée
        communicationsStack[processKey] = client;
    }
     
     
    /**
     * Cette methode est automatiquement appelé quand une communication internet
     * est terminée. Elle se charge alors de prévenir l'objet à l'origine de cette
     * communication, et le préviens que le travail est terminé, et qu'il peut analyser
     * la réponse.
     * @param bool error, indique si il y a eu une erreur pendant la discution
     * @return void
     */
    void HttpCommunicator::saveHttpResponse(int processKey, bool error)
    {
     
        if (error)  qDebug() << http->errorString();
     
        // Récupérer le client correspondant à la clé 
       QHash<int, IHttpCommunication *>::const_iterator i = communicationsStack.find(processKey);
    	if (i != communicationsStack.end() )
    	{
    		// Client trouvé, on le prévient : 
    		i.value()->httpCommunicationDone(false);
     
    		// On supprime l'entrée dans le QHash
    		communicationsStack.remove(processKey);
    	}
    	else
    	{
    		//... pas de client trouvé
    		qDebug() << "bad processKey";
    	}
     
    }


    et voici le code d'un objet qui doit implémenter IHttpCommunication
    Code c++ : 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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    class AlbumIndex : public IHttpCommunication
    {
    public:
        AlbumIndex();
     
        void httpCommunicationDone(bool error);
    	void initFromHttpDatas();
     
    private:
        QFile * file;
        QList<Album> albumsIndex;
    };
     
     
    AlbumIndex::AlbumIndex()
    {
        QFile * file = new QFile("allAlbumsDatas.xml");
        QList<Album> albumsIndex;
     
    	if (!file->open(QIODevice::WriteOnly)) 
    	{
    		QMessageBox::information(0, "HTTP",
                file->errorString());
    		delete file;
            file = 0;
            return;
    	}
    	qDebug() << "fichier cree et ouvert";
    }
     
     
     
    void AlbumIndex::initFromHttpDatas()
    {
        // Récupérer toutes les données des albums (et des photos) afin de construire l'app
     
        HttpCommunicator::GetInstance().startHttpCommunication(this, URL, file);
     
        // Analyse de la réponse (DOM)
        // ... 
     
    }
     
     
     
     
    void AlbumIndex::httpCommunicationDone(bool error)
    {
     
        qDebug() << "AlbumIndex::HttpCommunicationDone ";
        // ...
     
    }


    Voilà,
    Si vous voulez plus de précision dites le...

    Mais là je sèche depuis plusieurs jours sur cette même erreur, et je tourne en rond :s
    Tout ce que je sais, c'est qu'il y a un problème au moment où je fait à appel à la méthode virtual qu'aurait du surcharger mon ALbumIndex... Vu que le QHash contient des IHttpCommunication, c'est comme si il chercher à exécuter la méthode virtuel pure de mon interface, sans chercher à appelé la méthode redéfini de mon objet ...

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Le message d'erreur semble indiquer que tu as désactivé le RTTI.
    Je n'ai pourtant pas l'impression que tu t'en serves dans le code que tu as donné.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Je ne sais pas ce qu'est le RTTI, mais effectivement, j'ai fait un make clean, et depuis je n'ai plus d'erreur à la compilation ... par contre ça plante toujours à l'exécution au moment ou il essaye d'appeler la méthode virtual du IHttpCommunication

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut.
    tu utilise un const_iterator.
    Donc ta fonction devrait être const
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    virtual void httpCommunicationDone(bool error) = 0 const;
    C'est bizzare que cela compile.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Salut,

    J'ai enfin pu tester ce que tu m'as dit, seulement si je met un const, aprés le =0, ça ne compile pas, du coup, j'ai préféré enlever le cons_iterator (piqué directement d'un exemple de la doc Qt), et pris un simple iterator, ... mais le problème est toujours là.

    Edit :
    Je viens de tester à nouveau en mettant le const (avant le =0), et en laissant le const_iterator, mais ça ne change rien ...

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Ikit Voir le message
    J'ai enfin pu tester ce que tu m'as dit, seulement si je met un const, aprés le =0, ça ne compile pas,
    Je ne sait pas si il faut mettre avant ou aprés le =0. Il faut faire pareil pour les redéfinition.

    Citation Envoyé par Ikit Voir le message
    du coup, j'ai préféré enlever le cons_iterator (piqué directement d'un exemple de la doc Qt), et pris un simple iterator, ... mais le problème est toujours là.
    comprend tu la différence entre un iterator et un const_iterator?

    sinon je ne vois pas trop... Si tu peut faire un petit exemple de test (main qui utilise ta class) avec ton problème je testerais.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Salut,
    le const doit se mettre avant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    virtual void httpCommunicationDone(bool error) const = 0;
    Sinon au débuggueur, il ressemble à quoi le retour de i.value() ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    comprend tu la différence entre un iterator et un const_iterator?
    Absolument pas
    En fait je connait surtout le const qui indique qu'on ne peut pas modifier une variable, ou la valeur retourné par une fonction, mais mettre un const sur un void ou un iterator ne me dit rien ...


    Je ne sait pas si il faut mettre avant ou aprés le =0. Il faut faire pareil pour les redéfinition.
    Oui il fallait le mettre avant, et j'ai fait de même dans les redéfinitions, mais le problème persiste.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Ikit Voir le message
    Absolument pas
    En fait je connait surtout le const qui indique qu'on ne peut pas modifier une variable, ou la valeur retourné par une fonction, mais mettre un const sur un void ou un iterator ne me dit rien ...
    c'est le même but.
    un cons_iterator permet de spécifié que l'éléments correspondant ne peut être modifié
    Une fonction const spécifie que ta class ne sera pas modifié par son appel

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Ah bah c'est faut alors, car en appelant la methode httpCommunicationDone, les paramètres de ma classe seront modifiés ...

    Bon donc maintenant, j'ai enlever tout ces const disgracieux ... mais ça plante tjs à l'exécution.


    Edit :
    J'ai affiché les clés et la valeur des pointeurs de mon QHash, au moment où j'enregistre mon objet dans le QHash, et au moment ou il fait la recherche afin de le retrouver pour appeler la méthode httpCommunicationDone...

    Ils correspondent bien, donc si ça plante, c'est vraiment parceque mon QHash crois avoir à faire à un objet IHttpCommunication, et non pas à un objet AlbumIndex (qui implémente cette interface) ... sinon je ne vois pas pourquoi j'aurais un segfault à l'exécution ... dans la surcharge de cette méthode par mon objet AlbumIndex, j'ai juste mis un affichage en console

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    134
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 134
    Par défaut
    Ok c'est bon le problème est résolu.

    En fait mes virtual étaient bons...
    C'est juste que mon objet AlbumIndex était instancié en local dans le constructeur de ma fenêtre, du coup, il était détruit juste aprés ce qui fait que le pointeur de mon QHash dans le HttpCommunicator pointait dans le vide ... d'où le segmentation fault !


    merci à vous pour votre aide
    je peux continuer maintenant !

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

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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