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 :

Erreur de segmentation surcharge opérateur []


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 20
    Par défaut Erreur de segmentation surcharge opérateur []
    Bonjour,

    Je suis en train de travailler sur des listes chainées en C++ avec template et j'ai besoin de surcharger l'opérateur [] afin de pouvoir accéder à la valeur du i-ème maillon de ma liste si j'écris "Liste[i-1]" par exemple.
    Cependant j'obtiens une erreur de segmentation que je ne parviens pas à résoudre lors de l'exécution de mon programme.

    Voici mon code :

    Liste.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Début...
    T& operator[](int) const;
    //Fin...
    Liste.inl :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    //Début...
    template<class T>
    T& Liste<T>::operator[](int i) const
    {
            //Simple essai avec i = 0
            //Lignes qui posent problèmes 
            (*this)[i] = m_tete->m_data;
            return (*this)[i];
    }
    //Fin...
    et enfin main.cc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Début...
    cout << "Liste[0] : " << Liste[0] << endl; //Problème : erreur de segmentation
    //Fin...
    Toutes vos suggestions sont les bienvenues ! Merci d'avance

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Il me semble louche d'avoir dans la définition de l'opérateur [] un appel a ce même operateur ?

    j'aurais plutôt écrit une chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //En supposant qu'on accède au suivant par ->pNext,
     
    template<class T>
    T& Liste<T>::operator[](int i) const
    {
       T* pCurr = &m_tete;
       while(pCurr && i--){
          pCurr = pCurr->pNext;
       }
       return * pCurr;
    }
    //Fin...

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    De plus, pour une liste, ça me paraît louche d'avoir l'opérateur const qui retourne une référence non-const...
    Tu dois faire deux opérateurs:
    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
    template<class T>
    T const & Liste<T>::operator[](int i) const
    {
       T const * pCurr = &m_tete;
       while(pCurr && i--){
          pCurr = pCurr->pNext;
       }
       return * pCurr;
    }
     
    template<class T>
    T & Liste<T>::operator[](int i)
    {
       T* pCurr = &m_tete;
       while(pCurr && i--){
          pCurr = pCurr->pNext;
       }
       return * pCurr;
    }
    Ou réutiliser avec un const_cast bien placé:
    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
    //La version const reste const-correcte jusqu'au bout
    //et n'utilise aucun const_cast.
    template<class T>
    T const & Liste<T>::operator[](int i) const
    {
       T const * pCurr = &m_tete;
       while(pCurr && i--){
          pCurr = pCurr->pNext;
       }
       return * pCurr;
    }
     
    //La version non-const appelle la version const
    //et const_caste la référence retournée.
    template<class T>
    T & Liste<T>::operator[](int i)
    {
       //NOTE: On const_caste toujours le pointeur retourné,
       // et jamais this!
       Liste< T > const * thisC = this;
       T const & ret = (*thisC)[i];
       return const_cast< T & >(ret);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre averti
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 20
    Par défaut
    Hmmm oui pourquoi pas. J'avais pas envisagé cette solution, je vais essayer. Merci !

Discussions similaires

  1. Erreur compilation - surcharge opérateur
    Par lg_53 dans le forum C++
    Réponses: 18
    Dernier message: 23/03/2015, 11h18
  2. Erreur lors de surcharge d'opérateur
    Par Dani3L dans le forum C++
    Réponses: 9
    Dernier message: 18/09/2008, 20h12
  3. surcharge opérateur erreur compilation
    Par damien77 dans le forum C++
    Réponses: 8
    Dernier message: 21/02/2007, 17h59
  4. Surcharge opérateurs
    Par ghostdogpr dans le forum C++
    Réponses: 5
    Dernier message: 18/03/2005, 11h51
  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