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 :

Problème constructeur par copie listes chainées


Sujet :

C++

  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 Problème constructeur par copie listes chainées
    Bonjour !

    Je suis en train de créer des listes chainées en C++ (je sais que cela serait mieux en C, étant donnée que l'on peut utiliser le conteneur List en C++, mais c'est pour un travail) avec des templates et j'ai quelques difficultés depuis quelques jours avec le constructeur par copie de la liste.

    Voici mon Liste.h
    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
     
    #include<stdio.h>
    #include<stdlib.h>
     
    //Classe Maillon 
    template <class T>
    class Maillon
    {
            public:
                    T m_data;
                    Maillon <T>* m_next;
     
                    //Forme canonique de Coplien
                    Maillon();
                    Maillon(const Maillon <T>&);
                    ~Maillon();
    };
     
    //Classe Liste
    template <class T>
    class Liste 
    {
    	        Maillon <T>* m_tete;
    	        Maillon <T>* m_fin;
     
            public:
     
                    //Forme canonique de Coplien
                    Liste();
                    Liste(const Liste<T>&);
                    ~Liste();
    };
     
    #include "Liste.inl"
    et ici le fichier Liste.inl dans lequel j'implémente les méthodes précédentes :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    //Classe Maillon 
     
    //Constructeur par défaut
    template<class T>
    Maillon<T>::Maillon():m_data(),m_next(NULL){}
     
    //Constructeur par copie
    template<class T>
    Maillon<T>::Maillon(const Maillon<T>& leMaillon)
    {
            m_data = leMaillon.m_data;
            m_next = leMaillon.m_next;
    }
     
    //Destructeur
    template<class T>
    Maillon<T>::~Maillon(){}
     
    //Classe Liste
     
    //Constructeur par défaut
    template<class T> 
    Liste<T>::Liste():m_tete(NULL),m_fin(NULL){}
     
    //Constructeur normal
     
    //Constructeur par copie
    template<class T> 
    Liste<T>::Liste(const Liste<T>& laListe):m_tete(NULL),m_fin(NULL)
    {
            if (laListe.m_tete != NULL) //Si la liste n'est pas vide
            {
                    //Copie du premier élément
                    m_tete = new Maillon<T>(laListe.m_tete->m_data); 
     
                    //Copie du dernier élément 
                    m_fin = new Maillon<T>(laListe.m_fin->m_data);
     
                    //Pointeur qui parcours la liste que l'on copie
                    Maillon<T>* ptrParcours = laListe.m_tete; 
     
                    //Pointeur qui parcours la liste que l'on construit
                    Maillon<T>* ptrLocal = m_tete;
     
                    while (ptrParcours != NULL)
                    {
                            //On avance dans la liste "laListe"
                            ptrParcours = ptrParcours->m_next;
     
                             //On avance dans la liste locale
                            ptrLocal = ptrLocal->m_next; 
     
                            //Création d'un nouveau maillon
                            ptrLocal = new Maillon<T>(ptrParcours);
                    }
            }         
    }
     
     
    template<class T>
    Liste<T>::~Liste(){}
    Le problème arrive avec le main.cc à cause du constructeur par copie :
    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
     
    #include "Liste.h"
     
    #include <iostream>
    using namespace std;
     
    int main(int argc, char **argv)
    {
            cout << "\nDEBUT PROGRAMME DE TEST\n" << endl;
     
            Liste <int> L1;
            Liste <int> L2(L1);
     
            cout << "SORTIE PROGRAMME TEST\n" << endl;
    }
    J'ai un peu de mal à voir ou se trouve mes erreurs. Si quelqu'un pouvait m'aider à trouver ce qui ne va pas je lui en serai très reconnaissant.

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    J'ai juste regardé rapidement, donc j'ai pu louper un truc.

    J'ai l'impression que tu copies 2 fois le dernier maillon, ce qui fait que le dernier maillon connu par ta liste n'a aucun rapport avec le dernier maillon qui s'y trouve vraiment.

    Tu devrais plutôt avoir en fin de boucle un truc genre :
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Ta classe Maillon n'a pas de constructeur prenant un T en paramètre, alors que tu l'appelles dans ton new.

    De plus, je pense que tu devrais interdire la copie de Maillon (rendre son constructeur de copie privé).
    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
    Ok merci d'avoir répondu je vais regarder cela en détail. Est ce que tu pourrais m'expliquer la nécessité d'interdire la copie du maillon ?

    Merci !

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    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 392
    Par défaut
    Très simple: Tu ne doit pas copier un maillon car ça copierait le chaînage.
    Et si tu fais un constructeur de copie qui ne copie pas le chaînage, autant ne pas en faire du tout puisqu'il n'y a que m_data à copier.
    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.

Discussions similaires

  1. Réponses: 24
    Dernier message: 08/05/2008, 17h30
  2. Petit problème avec le constructeur par copie
    Par beegees dans le forum C++
    Réponses: 16
    Dernier message: 01/04/2008, 16h34
  3. [Debutant] Problème avec un constructeur par copie
    Par Drannor dans le forum Débuter
    Réponses: 5
    Dernier message: 12/03/2007, 09h15
  4. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15
  5. [deb.]Constructeur par copie
    Par Marc_3 dans le forum Débuter
    Réponses: 4
    Dernier message: 19/11/2005, 13h33

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