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 :

[POO] constructeur de copie pour une liste


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Points : 92
    Points
    92
    Par défaut [POO] constructeur de copie pour une liste
    salut !
    j'ai implémenter une liste doublement chainé circulaire , alors le probleme est au niveau de la destruction de la chaine , si j'ecrit le destructeur ,ça pose un probleme apres l'appel de la constructeur par defaut;
    un erreur de memoire , ça provient de destruction d'un objet deux fois (le constructeur de copie par defaut copie betement les pointeur ce qui rend 2 instances pointé par le meme pointeur , la destruction de la premiere instance est effectué avec succes mais la deuxieme provoque un erreur memoire ! mais si je detruit juste la tete et la queue de la liste tout va bien !
    de point de vue gestion memoire je crois que je doit tout detruire et ecrire un constructeur de recopie (peux etre recursive que j'arrive pas a le faire) qui recopier tout !
    voila le code , merci pour jeter un coup d'oeil sur le code , le destructeur qui detruit toute la liste est mis entre ();
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Si tu veux pouvoir copier ta liste, il faut que tu copie chaqun des éléments de celle-ci.
    Cela se fait, simplement, avec un boucle qui parcourt l'ensemble de la liste, depuis le premier élément jusqu'au dernier, et qui suit finalement exactement la même logique que l'insertion dans ta liste.

    Comme j'ai déjà fait une bonne partie du travail, je vais me contenter cette fois ci de te mettre sur la voie:
    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
    Expression::Expression(const Expression &e)
    {
        /* il faut un pointeur de type ElementList pour suivre la liste à copier
         * et un autre pour représenter l'élément à ajouter
         */
        ElementList* copy = e.first;
        ElementList* toadd;
        /* il faut parcourrir l'ensemble de la liste
        do
        {
             /* Créer une copie de l'élément à copier par allocation 
              * dynamique de la mémoiredynamiquement la mémoire pour toadd
              * 
              *insérer l'élément dans la liste
              * en prenant en compte le fait que ca peut être le premier élément
              * copié
              *
              * puis passer à l'élément suivant
              */
        }while(copy == /* a completer */ )
        /* il n'y a plus qu'à rendre la liste circulaire */
        premier->precedent = dernier;
        dernier->suivant = premier;
        /* et à vérifier que la taille de la nouvelle liste correspond bien à
         * celle de la liste à copier
         */
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Software engineer
    Inscrit en
    Août 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Software engineer

    Informations forums :
    Inscription : Août 2008
    Messages : 139
    Points : 92
    Points
    92
    Par défaut
    merci pour votre reponse,alors j'ai ecrit le constructeur de copie suivant :
    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
     
    Expression::Expression(const Expression &e)
    {
        taille = 0;
        ElementListe *debut=new ElementListe;
        ElementListe *courant=new ElementListe;
        debut->suivant=debut;
        debut->precedent=debut;
        fin=debut;
        courant = e.debut;
        int i=0;
        while(i<e.taille){
            ElementListe *toadd = new ElementListe;
            fin->suivant=toadd;
            toadd->donnee = courant->donnee;
            toadd->precedent = fin;
            toadd->suivant = debut;
            fin=toadd;
            toadd=0;
            courant = courant->suivant;
            taille++;
            i++;
        }
        cout << i << endl;
        delete courant;
    }
    mais ça donne des fausses resultats ! et le programme s'interrompe avec un message de violation mémoire ! il n'arrive meme pas au destructeur , la violation memoire est probablement dans ce constructeur !
    merci

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Attention, grosse connerie: Tu fais de courant un pointeur pour parcourir e, mais tu cherches à faire un delete dessus ensuite!
    De plus, la première valeur de courant est leakée.

    Il te faut faire un truc plus simple :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Expression::Expression(const Expression &e)
    {
    	//Initialisation
    	taille = 0;
    	debut = NULL;
     
    	for(ElementListe const *courant = e.debut ; courant!=NULL ; courant=courant->suivant)
    	{
    		AjouterElement(courant->donnee);
    	}
    }

  5. #5
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Je me demande, est-ce que dans ce cas il ne serait pas judicieux d'implémenter le concept Iterable et de confier la tâche de copie à un algo de la STL ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 575
    Points
    41 575
    Par défaut
    Dans ce cas, pourquoi ne pas directement utiliser une std::list<> ?

  7. #7
    Membre éclairé
    Avatar de Florian Goo
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    680
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 680
    Points : 858
    Points
    858
    Par défaut
    Une std::list ne peut pas être circulaire… si ?

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par Florian Goo Voir le message
    Une std::list ne peut pas être circulaire… si ?
    Normalement, elle n'est implémentée que comme une liste normale, mais, rien n'empêche, pour la rendre circulaire, de rajouter un test sur l'itérateur vérifiant si on est arrivé à la fin de la liste

    Ceci dit, il est vrai que l'on "perd" un peu de la beauté des listes circulaires qui est, justement, d'éviter d'avoir à gérer le retour en début de liste

  9. #9
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Il existe des bibliothèques contenant des listes circulaires template STL-Like. Je ne me souviens plus des noms mais google devrait aider pour ça.

    Par contre, si c'est un exercice, rien à faire, faut partir de 0

Discussions similaires

  1. [SP-2013] Erreurs de webpart pour une liste copiée
    Par Kael_004 dans le forum SharePoint
    Réponses: 7
    Dernier message: 14/05/2014, 11h38
  2. Réponses: 24
    Dernier message: 08/05/2008, 17h30
  3. Constructeur par copie et std::list
    Par Captain_JS dans le forum SL & STL
    Réponses: 5
    Dernier message: 13/12/2005, 19h15
  4. implémenter la notion "au moins" pour une liste d'
    Par mohamed dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 18/08/2004, 00h07
  5. [Debutant(e)]conseil pour une liste ?
    Par Tymk dans le forum Débuter
    Réponses: 5
    Dernier message: 05/08/2004, 14h33

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