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 :

liste chainée et point «this»


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par défaut liste chainée et point «this»
    Bonjour,

    Je suis débutant en c++ et je tente de résoudre un problème dans le cadre d'un cours.

    Je dois écrire un programme qui utilise le pointeur «this» dans la gestion d'une liste chainée d'objet d'une même classe.

    Je ne comprend pas comment implanter le pointeur «this» dans ce contexte.

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Ce n'est pas très difficile : « this » est un pointeur vers l'instance de l'objet courant.

    Le principe de la liste chaînée est que chaque objet contient, en plus de ses propres données, un pointeur vers l'objet suivant.

    Si tu fais une liste chaînée et que chaque objet un potentiellement un maillon de cette chaîne, alors quand tu insères un objet au milieu de la liste, il faudra que tu pointes l'instance suivante dans ta propre instance, ça tu peux le faire implicitement, mais il faudra également que tu modifies la précédente pour qu'elle te pointe toi.

    Il te faut donc connaître ta propre adresse et c'est this qui va te la donner.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par défaut
    Merci pour l'explication, j'ai un problème par contre.L'ajout de données fonctionne mais il y a un problème lors de la suppression de données. Voici mon code jusqu'à présent.

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    #include <iostream.h>
    #include <conio.h>
    #include <string.h>
     
     
    class noeud{
     
            public:
            noeud (): suivant (NULL), precedent (NULL) {}
            virtual ~noeud ();
            bool dernier () {return (suivant ? false : true);}
            bool premier () {return !dernier ();}
            bool unique () {return ((precedent && suivant) ? false : true);}
     
            void ajouter (noeud *noeud);
            void supprimer ();
     
            protected:
            noeud *suivant;
            noeud *precedent;
    };
     
    noeud::~noeud (){
     
            if (!dernier ()){
            delete suivant;
            suivant = 0;}
            supprimer ();
    }
     
    void noeud::supprimer (){
     
            if (precedent)
            precedent->suivant = suivant;
            if (suivant)
            suivant->precedent = precedent;
            precedent = NULL;
            suivant = NULL;
    }
     
    void noeud::ajouter (noeud *noeud){
     
            if (noeud->unique ()){
            if (dernier ()){
            suivant = noeud;
            noeud->precedent = this;
            noeud->suivant = NULL;}
            else{
            suivant->ajouter (noeud);}
            }
    }
     
    class membre : public noeud{
     
            public:
            membre () {}
            membre (string name): _name (name) {}
     
            void affichermembre (){
            afficher ();
            if (!dernier ())
            dynamic_cast<membre *>(suivant)->affichermembre ();}
     
            protected:
            string _name;
     
            private:
            virtual void afficher () {}
    };
     
    class nom : public membre{
     
            public:
            nom (string name): membre (name) { }
     
            private:
            virtual void afficher () { cout << " " << _name << endl; }
    };
     
    int main (){
     
            cout << " Voici une liste de membre selon un liste chainee :" << endl << endl;
            membre *listemembre = new membre ();
     
            nom *Barack = new nom ("Barack Obama");
            nom *George = new nom ("George W. Bush");
     
            listemembre->ajouter (Barack);
            listemembre->ajouter (George);
            listemembre->supprimer (Barack);
     
            listemembre->affichermembre ();
     
     
    getch();
    return 0;
    }

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,




    Citation Envoyé par mortis11 Voir le message
    L'ajout de données fonctionne mais il y a un problème lors de la suppression de données. Voici mon code jusqu'à présent.
    C'est à dire ? Un segfault ? Une fuite de mémoire ? Des résultats incohérents?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par défaut
    Voici ce qui apparait comme erreur:

    [C++ Error] Unit1.cpp(89): E2227 Extra parameter in call to noeud::supprimer()

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Ça veut dire « Paramètre en trop ».

    Et c'est bien ce qui se passe : tu as défini une fonction-membre « supprimer() » qui n'attend aucun paramètre (et se contente de supprimer le nœud courant) mais tu l'appelles quand même, dans ta fonction main, en lui passant un nom.

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par défaut
    Si je l'appelle sans paramètre je supprime tout. Je ne comprend pas comment modifier ma fonction supprimer afin d'uniquement supprimer le noeud courrant.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void noeud::supprimer (){
     
            if (precedent)
            precedent->suivant = suivant;
            if (suivant)
            suivant->precedent = precedent;
            precedent = NULL;
            suivant = NULL;
    }
    Tu m'étonnes que tout est supprimé !
    Sais-tu ce que tu as écrit ? D'où sors-tu ce code si tu ne l'as pas écrit ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Novembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 5
    Par défaut
    J'ai simplement tenté d'adapter un code que j'avais dans mes note de cours à cette situation.

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

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