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

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

Marsh Posté le 11-02-2006 à 16:33:07    

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
Reply

Marsh Posté le 11-02-2006 à 16:33:07   

Reply

Marsh Posté le 11-02-2006 à 19:47:55    

Reply

Marsh Posté le 12-02-2006 à 16:09:43    

Vraiment personne ? :cry:


---------------
Pier noir la mèr - La chanson par HFR Band - Topic TrueCrypt
Reply

Marsh Posté le 12-02-2006 à 17:08:06    

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) :?:

Reply

Marsh Posté le 12-02-2006 à 17:13:19    

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
Reply

Marsh Posté le 12-02-2006 à 17:18:02    


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é!  --
Reply

Marsh Posté le 12-02-2006 à 17:20:16    

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.

Reply

Marsh Posté le 12-02-2006 à 17:22:11    

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
Reply

Marsh Posté le 12-02-2006 à 17:27:27    

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
Reply

Marsh Posté le 12-02-2006 à 17:28:18    

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é!  --
Reply

Marsh Posté le 12-02-2006 à 17:28:18   

Reply

Marsh Posté le 12-02-2006 à 17:33:38    

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
Reply

Marsh Posté le 12-02-2006 à 17:34:51    

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é.

Reply

Marsh Posté le 12-02-2006 à 17:36:13    

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.

Reply

Marsh Posté le 12-02-2006 à 17:47:40    

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
Reply

Marsh Posté le 14-02-2006 à 13:56:23    

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
Reply

Marsh Posté le 14-02-2006 à 14:12:07    

Connait pas sa définition

Reply

Marsh Posté le 14-02-2006 à 14:18:32    

ç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
Reply

Marsh Posté le 14-02-2006 à 14:20:14    

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
 

Reply

Marsh Posté le 14-02-2006 à 14:24:26    

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

Reply

Marsh Posté le 14-02-2006 à 15:04:50    

d'ailleur aucun friend ne sert dans ce code

Reply

Marsh Posté le 14-02-2006 à 16:12:30    


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
Reply

Marsh Posté le 14-02-2006 à 16:22:24    

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

Reply

Marsh Posté le 14-02-2006 à 16:23:45    

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
Reply

Marsh Posté le 14-02-2006 à 16:28:12    

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

Reply

Marsh Posté le 14-02-2006 à 16:30:43    


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
Reply

Marsh Posté le 14-02-2006 à 16:34:01    

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

Reply

Marsh Posté le 14-02-2006 à 16:44:45    

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
Reply

Marsh Posté le 14-02-2006 à 16:48:20    

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

Reply

Marsh Posté le 14-02-2006 à 17:25:32    

chrisbk a écrit :

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


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

Reply

Marsh Posté le 14-02-2006 à 17:27:21    

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

Reply

Marsh Posté le 14-02-2006 à 17:28:46    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed