Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1417 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++ débutant] Liste chaînée, suite des problemes :D

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++ débutant] Liste chaînée, suite des problemes :D

n°1303500
ParadoX
Posté le 11-02-2006 à 16:33:07  profilanswer
 

Bonjour,  
 
Dans le cadre d'un projet C++ pour la Fac, j'ai besoin de manipuler une Liste chainée d'objets. Pour commencer, je me suis dit que je vais tester avec une liste chaînée de Int avant d'attaquer de suite avec les objets.  
 
Mes classes:
 
liste.h

Code :
  1. #ifndef _Liste_h
  2. #define _Liste_h
  3. #include <iostream.h>
  4. class Liste
  5. {
  6. private:
  7.  class Node
  8.  {
  9.   friend class Iterateur;
  10.   friend class Liste;
  11.   public:
  12.    Node();
  13.    
  14.   private:
  15.    int valeur;
  16.    Node *suivant;
  17.    Node *precedent;
  18.  };
  19.  Node *tete;
  20.  Node *queue;
  21.  int nbElements;
  22. public:
  23.  Liste();
  24.  ~Liste();
  25.  int getNbElements() const;
  26.  void incNbElements();
  27.  bool estVide() const;
  28.  void ajoutFin(int);
  29.  void ajouterTete(int);
  30.  void supprimerTete();
  31.  void supprimerQueue();
  32.  int valeurTete() const;
  33.  int valeurQueue() const;
  34.  friend class Iterateur;
  35. };
  36. #endif


 
iterateur.h

Code :
  1. #ifndef _Iterateur_h
  2. #define _Iterateur_h
  3. #include <iostream.h>
  4. class Iterateur
  5. {
  6. friend class Liste;
  7. private:
  8.  Liste::Node **actuel;
  9.  Liste *liste;
  10. public:
  11.  Iterateur(Liste & );
  12.  ~Iterateur();
  13.  void avance();
  14.  void recule();
  15.  void retourTete();
  16.  int  valeur() const;
  17.  void ajouter(int);
  18.  void supprimer();
  19.  bool iterFin() const;
  20. };
  21. #endif


 
liste.cpp: (inachevé)

Code :
  1. #include "liste.h"
  2. #include "iterateur.h"
  3. // Constructeur de la liste
  4. Liste::Liste()
  5. {
  6. this->tete = NULL;
  7. this->queue = NULL;
  8. this->nbElements = 0;
  9. }
  10. // Constructeur par défaut du noeud
  11. Liste::Node::Node()
  12. {
  13. this->suivant = NULL;
  14. this->precedent = NULL;
  15. this->valeur = NULL;
  16. }
  17. // Destructeurs
  18. Liste::~Liste()
  19. {
  20. }
  21. //Methodes
  22. //La liste est-elle vide ?
  23. bool Liste::estVide() const
  24. {
  25. if(this->tete == NULL) return true;
  26. else return false;
  27. }
  28. //Ajout en tête de Liste
  29. void Liste::ajouterTete(int maValeur)
  30. {
  31. //Creation et remplissage du nouveau noeud
  32. Node *nouv = new Node();
  33. nouv->valeur = maValeur;
  34. nouv->suivant = tete;
  35. nouv->precedent = NULL;
  36. //2 cas: La liste est vide, ou elle ne l'est pas
  37. if(!estVide())
  38. {
  39.  tete = nouv;
  40. }
  41. else
  42. {
  43.  tete = nouv;
  44.  queue = nouv;
  45. }
  46. this->nbElements ++;
  47. }
  48. //Ajout en fin de Liste
  49. void Liste::ajoutFin(int maValeur)
  50. {
  51. Node *nouv = new Node();
  52. nouv->valeur = maValeur;
  53. nouv->suivant = NULL;
  54. if(!estVide())
  55. {
  56.  queue->suivant = nouv;
  57.  nouv->precedent = queue;
  58.  queue = nouv;
  59. }
  60. else
  61. {
  62.  tete = nouv;
  63.  queue = nouv;
  64.  nouv->precedent = NULL;
  65. }
  66. this->nbElements ++;
  67. }
  68. //Nombre d'elements dans la liste
  69. int Liste::getNbElements() const
  70. {
  71. return this->nbElements;
  72. }
  73. //Incremenatation du nombre d'elements dans la liste
  74. void Liste::incNbElements()
  75. {
  76. this->nbElements ++;
  77. }
  78. //Valeur de la tête
  79. int Liste::valeurTete() const
  80. {
  81. if(!estVide())
  82.  return tete->valeur;
  83. else
  84.  throw -1;
  85. }
  86. //Valeur de la Queue
  87. int Liste::valeurQueue() const
  88. {
  89. if(!estVide())
  90.  return queue->valeur;
  91. else
  92.  throw -1;
  93. }
  94. //Suppression de la tête
  95. void Liste::supprimerTete()
  96. {
  97. }


 
et iterateur.cpp:
 

Code :
  1. #include "liste.h"
  2. #include "iterateur.h"
  3. //Constructeur de l'iterateur
  4. Iterateur::Iterateur(Liste &maListe)
  5. {
  6. this->actuel = &(maListe.tete);
  7. this->liste = &maListe;
  8. }
  9. //Destructeur
  10. Iterateur::~Iterateur()
  11. {
  12. //rien à faire
  13. }
  14. //Méthodes
  15. //Retour de la valeur contenue dans le node actuelle
  16. int Iterateur::valeur() const
  17. {
  18. return (**actuel).valeur;
  19. }
  20. //Fait avancer l'iterateur
  21. void Iterateur::avance()
  22. {
  23. this->actuel = &((*(*actuel)).suivant);
  24. }
  25. //Fait reculer l'iterateur
  26. void Iterateur::recule()
  27. {
  28. this->actuel = &((*(*actuel)).precedent);
  29. }
  30. //Ajoute un element dans la liste
  31. void Iterateur::ajouter(int maValeur)
  32. {
  33. Liste::Node *nouv = new Liste::Node();
  34. nouv->suivant = (*(*actuel)).suivant;
  35. nouv->precedent = (*actuel);
  36. ((*(*actuel)).suivant)->precedent = nouv;
  37. (*(*actuel)).suivant = nouv;
  38. Liste::incNbElements();    // ------------> C'est ici que ça foire ! Voir plus bas
  39. }


 
Problème:
 
Je ne comprends pas pourquoi celui-ci ne va pas:
 

Code :
  1. //Incremenatation du nombre d'elements dans la liste
  2. void Liste::incNbElements()
  3. {
  4. this->nbElements ++;
  5. }


 
C'est un peu comme une méthode Get/Set: Elle devrait avoir accès au nbElements de la liste courante, qui lui est une donnée membre de la classe Liste.
 

Code :
  1. class Liste
  2. {
  3. private:
  4.  class Node
  5.  {
  6.                    ...
  7.  };
  8.  Node *tete;
  9.  Node *queue;
  10.  int nbElements;


 
Pour le int getNbElements() const; , je fais bien référence à nbElements (sans le modifier, bien entendu), et il me retourne bien celui de la liste courante :/
 
 :sweat:


Message édité par ParadoX le 11-02-2006 à 16:34:38

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
mood
Publicité
Posté le 11-02-2006 à 16:33:07  profilanswer
 

n°1303552
ParadoX
Posté le 11-02-2006 à 19:47:55  profilanswer
 
n°1303748
ParadoX
Posté le 12-02-2006 à 16:09:43  profilanswer
 

Vraiment personne ? :cry:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1303766
pj_crepes
Posté le 12-02-2006 à 17:08:06  profilanswer
 

Ok donc comme sa je ne vois pas en revanche je trouve sa dommage de créer une méthode pour si peu.
Je pense que aurais du mettre "nbElements" static, puis faire un inline Liste::incNbElements().
 
Sinon peux tu donner l'erreur exacte du compilateur (ou du linker dailleurs) :?:

n°1303768
ParadoX
Posté le 12-02-2006 à 17:13:19  profilanswer
 

Liste::incNbElements' : illegal call of non-static member function
 
Chrisbk- m'avait dit qu'il fallait que incNbElements ait un parametre lui indiquant de quelle liste il s'agit. Mais si c'est une méthode de classe, ça se réfere a l'objet courant, non ? Pourquoi ça marche avec getNbElements() alors ? :sweat:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1303773
gilou
Modérateur
Modzilla
Posté le 12-02-2006 à 17:18:02  profilanswer
 


Citation :

Liste::incNbElements();    // ------------> C'est ici que ça foire ! Voir plus bas


 
 
Ca serait pas plutot liste->incNbElements();    qui aurait un sens dans le contexte de ton appel?
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1303775
pj_crepes
Posté le 12-02-2006 à 17:20:16  profilanswer
 

Ouai en faite c'est normal que sa ne fonctionne pas.
Quand tu fait sa tu t'adresse à quelle liste ? (quel objet ?)
 

Code :
  1. Liste::incNbElements();    // ------------> C'est ici que ça foire ! Voir plus bas


 
C'est exactement ce que te dit le compilateur qu'il ne s'agit pas d'une méthode statique.
Par conséquent tu as cette méthode dans chaque objet (c'est pour sa que je te disais que le inline est préférrable dans ton cas, pour éviter de mettre cette méthode dans chaque objet).
 
Par conséquent tu ne pas utiliser cette méthode comme sa, il te faut une référence.

n°1303777
pj_crepes
Posté le 12-02-2006 à 17:22:11  profilanswer
 

gilou a écrit :

Citation :

Liste::incNbElements();    // ------------> C'est ici que ça foire ! Voir plus bas


 
 
Ca serait pas plutot liste->incNbElements();    qui aurait un sens dans le contexte de ton appel?
 
A+,


 
lol
 
+1
 
 
Mais à mon avis le plus simple est de mettre ton nombre d'élément "static", et de faire un inline comme assesseur.
 
Pour ce qui est du type générique la seule solution c'est de passer par les templates à mon sens.
 
 
Bon courrage.


Message édité par pj_crepes le 12-02-2006 à 17:22:42
n°1303782
pj_crepes
Posté le 12-02-2006 à 17:27:27  profilanswer
 

gilou a écrit :

Citation :

Liste::incNbElements();    // ------------> C'est ici que ça foire ! Voir plus bas


 
 
Ca serait pas plutot liste->incNbElements();    qui aurait un sens dans le contexte de ton appel?
 
A+,


 
 
En faite dans l'hypotèse où "liste" est une référence (handle), sa donnerait plutôt sa :
 
liste.incNbElements();


Message édité par pj_crepes le 12-02-2006 à 17:27:50
n°1303783
gilou
Modérateur
Modzilla
Posté le 12-02-2006 à 17:28:18  profilanswer
 

Il n'y a aucune raison de mettre le nb d'élements en static ici.
Ca reviendrait a partager entre tous les listes de la classe Liste la variable nb d'élements, non? bonjour les dégats...
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 12-02-2006 à 17:28:18  profilanswer
 

n°1303785
ParadoX
Posté le 12-02-2006 à 17:33:38  profilanswer
 

Merci je vais tenter ... mais comment m'expliquez-vous que ça fonctionne sur l'instance en cours avec "getNbElements()" ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1303786
pj_crepes
Posté le 12-02-2006 à 17:34:51  profilanswer
 

gilou a écrit :

Il n'y a aucune raison de mettre le nb d'élements en static ici.
Ca reviendrait a partager entre tous les listes de la classe Liste la variable nb d'élements, non? bonjour les dégats...
 
A+,


 
C'est très vrais, j'ai craqué  :D  
désolé.

n°1303787
pj_crepes
Posté le 12-02-2006 à 17:36:13  profilanswer
 

ParadoX a écrit :

Merci je vais tenter ... mais comment m'expliquez-vous que ça fonctionne sur l'instance en cours avec "getNbElements()" ?


 
Bin je ne sais pas dans quel contexte tu l'utilises ?
Parce que je ne vois où tu l'utilises dans ton code.

n°1303791
ParadoX
Posté le 12-02-2006 à 17:47:40  profilanswer
 

C'est bon j'ai tout compris, et ça marche. :D Mercii beacoup, je reviens incessamment sous peu pour d'autres questions ^^
 
 :jap:  :jap:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305163
ParadoX
Posté le 14-02-2006 à 13:56:23  profilanswer
 

Bien  [:ddr555]  
 
Maintenant que ma liste de INT marche, j'ai voulu remplacer les INT par des Objets de ma classe Objet que voici: (très sommaire pour l'instant, je la développerai quand la liste fonctionnera avec)
 

Code :
  1. class Objet
  2. {
  3. private:
  4.  char *nom;
  5. public:
  6.  Objet(char *nom);
  7. };


 
J'ai remplacé toutes les occurences de "int" avec "Objet" dans les données membres de ma liste ainsi que dans les méthodes. Mais déja dans le .h le compilateur gueule:
 

Code :
  1. class Liste
  2. {
  3. friend class Iterateur;
  4. friend class Objet;
  5. private:
  6.  class Node
  7.  {
  8.   friend class Objet;
  9.   friend class Iterateur;
  10.   friend class Liste;
  11.   public:
  12.    Node();
  13.    Node(Objet maValeur);
  14.    Node(Objet maValeur, Node *suivant, Node *precedent);
  15.    
  16.   private:
  17.    Objet valeur;
  18.    Node *suivant;
  19.    Node *precedent;
  20.  };
  21.  Node *tete;
  22.  Node *queue;
  23.  int nbElements;
  24. public:
  25.  Liste();
  26.  ~Liste();
  27.  int getNbElements() const;
  28.  void incNbElements();
  29.  bool estVide() const;
  30.  void ajoutFin(Objet);
  31.  void ajouterTete(Objet);
  32.  void supprimerTete();
  33.  void supprimerQueue();
  34.  int valeurTete() const;
  35.  int valeurQueue() const;
  36. };


 
Erreur à la ligne 19:  
use of undefined type 'Objet'
 
Pourtant je l'ai mis en classe Friend ... pourquoi refuse-t-il ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305191
chrisbk
-
Posté le 14-02-2006 à 14:12:07  profilanswer
 

Connait pas sa définition

n°1305201
ParadoX
Posté le 14-02-2006 à 14:18:32  profilanswer
 

ça, jlai compris moi-même :sarcastic:  
Mais pourquoi ? Où faut-il que je lui précise en plus ? La classe est en Friend !


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305202
chrisbk
-
Posté le 14-02-2006 à 14:20:14  profilanswer
 

mais y s'en fout qu'elle soit en friend. Il ne connait pas object. Tu demandes une instantation statique de Object. Donc pour cela il doit savoir ce qu'est objet (un typedef ? une classe ? une structure ? ) et de quoi object est fait
 
donc tu fais #include "objet.h" au dessus de ta liste
 

n°1305206
chrisbk
-
Posté le 14-02-2006 à 14:24:26  profilanswer
 

(d'ailleurs je vois pas trop pkoi tu veux mettre Objet en friend)

n°1305271
skelter
Posté le 14-02-2006 à 15:04:50  profilanswer
 

d'ailleur aucun friend ne sert dans ce code

n°1305365
ParadoX
Posté le 14-02-2006 à 16:12:30  profilanswer
 


J'ai changé la class friend en fonction friend, dans mon mail j'ai un print qui tape direct dans les données private de l'objet, alors j'en avais besoin. Tout fonctionne maintenant, merci à tous :)


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305383
chrisbk
-
Posté le 14-02-2006 à 16:22:24  profilanswer
 

ParadoX a écrit :

J'ai changé la class friend en fonction friend, dans mon mail j'ai un print qui tape direct dans les données private de l'objet, alors j'en avais besoin. Tout fonctionne maintenant, merci à tous :)


 
 
ca craint un peu de l'arriere train ca

n°1305385
ParadoX
Posté le 14-02-2006 à 16:23:45  profilanswer
 

Comment je fais afficher le contenue d'une liste alors ?
La fonction print est en const, ou est le danger ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305394
chrisbk
-
Posté le 14-02-2006 à 16:28:12  profilanswer
 

ta liste apelle objet.print() qui lui se charge de s'afficher

n°1305402
ParadoX
Posté le 14-02-2006 à 16:30:43  profilanswer
 


Ok je vais tenter, merci.
Mais sinon, ya rien de "mal" à faire comme j'ai fait, enfin ça marche très bien.. Une foncion const est la pour ça, non ? C'est juste que ça ne correspond pas aux "standards" des programmeurs C++, ou ce n'est pas très orienté objet ?


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305409
chrisbk
-
Posté le 14-02-2006 à 16:34:01  profilanswer
 

bin tu court circuites pas mal de truc avec tes friends, c'est un peu con d'autant plus que c'est inutile

n°1305425
ParadoX
Posté le 14-02-2006 à 16:44:45  profilanswer
 

Ah jme rappelle pkoi j'avais fait comme ça ...
pour le print, je place un iterateur sur une liste ( Iterateur(Liste & ); ) qui va parcourir la liste ... maintenant, si je déclare le print dans liste.cpp, je dois initialiser un iterateur sur la liste courante :/ Il n'accepte pas "this" !
 
cannot convert parameter 1 from 'const class Liste *const ' to 'class Liste &'


Message édité par ParadoX le 14-02-2006 à 16:45:58

---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
n°1305428
chrisbk
-
Posté le 14-02-2006 à 16:48:20  profilanswer
 

jpige pas tout [:el g] jsuppose que ton iterateur n'accepte pas de cost Liste *, et que vu que ton print est en const ca pete la

n°1305470
slash33
Posté le 14-02-2006 à 17:25:32  profilanswer
 

chrisbk a écrit :

ta liste apelle objet.print() qui lui se charge de s'afficher


Ou il pourrait faire une méthode string toString()

n°1305471
chrisbk
-
Posté le 14-02-2006 à 17:27:21  profilanswer
 

bof [:el g] on est pas en java [:icone:8]

n°1305476
slash33
Posté le 14-02-2006 à 17:28:46  profilanswer
 

Pourtant je trouve cela plus intéressant, notamment à des fins de debuggage.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++ débutant] Liste chaînée, suite des problemes :D

 

Sujets relatifs
envoie résultat d'un formulaire sur liste de contactsptit'pb à résoudre, débutant total
[resolu]Debutant en php - derniere connectionListe déroulante avec onchange et conservation des données précédentes
(question débutant) Afficher du texte à partir d'un .txtDébutant en POO, class mysql php5
Liste des language de programmation[VC++] Liste
[JAVA - Débutant] - Probleme premier programme en JAVAsuite apres l'écriture manuelle d'un programme
Plus de sujets relatifs à : [C++ débutant] Liste chaînée, suite des problemes :D


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR