[C++] Liste chainée générique (template) [résolu]

Liste chainée générique (template) [résolu] [C++] - C++ - Programmation

Marsh Posté le 10-04-2002 à 20:53:52    

Kkun peut me dire pourquoi j'ai des erreurs lors de l'édition des liens ?
 
Parce que là je cale complet...
 

Code :
  1. #ifndef LISTECHAINEE_H
  2. #define LISTECHAINEE_H
  3. #include <iostream.h>
  4. #include "String.h"
  5. template <class T>
  6. class ListeChainee {
  7. private:
  8. class Noeud {
  9. public:
  10.  T* m_pE;
  11.  Noeud* m_pSuiv;
  12. };
  13. Noeud* m_pTete;
  14. public:
  15. // Constructeurs / Destructeur
  16. ListeChainee();
  17. ListeChainee(T&);
  18. ListeChainee(ListeChainee<T>&);
  19. ~ListeChainee();
  20. // Primitives liste chainée
  21. void Supprimer();   // Supprime le dernier élément
  22. void Supprimer(String&); // Supprime l'élément qui porte le nom en param
  23. void Inserer(T&);   // Insère T en fin de liste
  24. void Afficher();   // Affiche tous les éléments
  25. // Fonctions
  26. int     NombreElem(); // Retourne le nombre d'éléments
  27. // Surcharge des opérateurs
  28. friend ostream& operator << (ostream&, ListeChainee<T>&);
  29. };
  30. #endif LISTECHAINEE_H
  31. ---------------------------------------
  32. #include <iostream.h>
  33. #include "ListeChainee.h"
  34. void main() {
  35. String toto("Toto" );
  36. ListeChainee<String> liste();
  37. liste.Inserer(toto);
  38. }

 

[jfdsdjhfuetppo]--Message édité par zeux--[/jfdsdjhfuetppo]


---------------
Guerre Dollar - Euro : la chute economique des Etats-Unis avant 2010.
Reply

Marsh Posté le 10-04-2002 à 20:53:52   

Reply

Marsh Posté le 10-04-2002 à 21:22:20    

c'est quoi ton String.h c'est un truc perso?
Parce qu'il y a un fichier de la librairie
standard C qui s'appelle string.h
et un fichier de la STL qui s'appelle string
et qui definit un objet de type string (sans majuscule)
 
Sinon peux-tu faire un copier coller des messages d'erreur du compilateur?
 
LEGREG

Reply

Marsh Posté le 10-04-2002 à 22:13:22    

legreg a écrit a écrit :

c'est quoi ton String.h c'est un truc perso?
Parce qu'il y a un fichier de la librairie
standard C qui s'appelle string.h
et un fichier de la STL qui s'appelle string
et qui definit un objet de type string (sans majuscule)
 
Sinon peux-tu faire un copier coller des messages d'erreur du compilateur?
 
LEGREG  




c un truc a moi
 

Code :
  1. Linking...
  2. testListeChainee.obj : error LNK2001: unresolved external symbol "public: __thiscall ListeChainee<class String>::~ListeChainee<class String>(void)" (??1?$ListeChainee@VString@@@@QAE@XZ)
  3. testListeChainee.obj : error LNK2001: unresolved external symbol "public: __thiscall ListeChainee<class String>::ListeChainee<class String>(class String &)" (??0?$ListeChainee@VString@@@@QAE@AAVString@@@Z)
  4. Debug/ListeChainee.exe : fatal error LNK1120: 2 unresolved externals
  5. Error executing link.exe.
  6. ListeChainee.exe - 3 error(s), 0 warning(s)


---------------
Guerre Dollar - Euro : la chute economique des Etats-Unis avant 2010.
Reply

Marsh Posté le 10-04-2002 à 22:23:05    

il est ou le corps de tes fonctions?
 
LEGREG

Reply

Marsh Posté le 10-04-2002 à 23:31:48    

Pourkoi se faire chier a implementer des listes chainees alors ke les librairies STL le font???????????????
Si c un exo pour t cours je né rien dit.....

Reply

Marsh Posté le 11-04-2002 à 00:20:53    

std::list<T>

Reply

Marsh Posté le 11-04-2002 à 05:44:43    

Verdoux a écrit a écrit :

std::list<T>  




 [:virginie]  :jap:

 

[jfdsdjhfuetppo]--Message édité par gilou--[/jfdsdjhfuetppo]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 11-04-2002 à 12:25:01    

Verdoux a écrit a écrit :

std::list<T>  




c un exo pour un cours.
 
Le corps des fonctions est a mon avis inutile pour résoudre le probleme. En fait j'ai remarqué que tout marchait bien a condition de mettre tout dans le .h (prototypes + implémentation). A priori cela vient du fait que c'est une classe template. Problème résolu.


---------------
Guerre Dollar - Euro : la chute economique des Etats-Unis avant 2010.
Reply

Marsh Posté le 11-04-2002 à 13:25:32    

zeux a écrit a écrit :

 
Le corps des fonctions est a mon avis inutile pour résoudre le probleme. En fait j'ai remarqué que tout marchait bien a condition de mettre tout dans le .h (prototypes + implémentation).  




tu n'as donc pas du bien comprendre ma question..
Le corps des fonctions est indispensable parce qu'il s'agit
d'une classe template et donc le code n'est
genere qu'a l'instanciation.
 
LEGREG

Reply

Marsh Posté le 11-04-2002 à 13:46:13    

legreg a écrit a écrit :

 
tu n'as donc pas du bien comprendre ma question..
Le corps des fonctions est indispensable parce qu'il s'agit
d'une classe template et donc le code n'est
genere qu'a l'instanciation.
 
LEGREG  




Et alors  :heink:  en quoi ca implique que le code doive se trouver dans le .h ???  :heink:
 
Je reprends ma phrase parce qu'à priori je me suis mal exprimé. Le code des fonctions je l'ai fait, mais je pense qu'il est inutile de le mettre ici sur le forum car il est correct.
 
Néanmoins j'ai remarqué que mon problème se résolvait à partir du moment où je réunis dans le même fichier include le code des fonctions et leurs prototypes (la déclaration de la classe). Je voudrais comprendre pourquoi et surtout savoir comment faire autrement.

 

[jfdsdjhfuetppo]--Message édité par zeux--[/jfdsdjhfuetppo]


---------------
Guerre Dollar - Euro : la chute economique des Etats-Unis avant 2010.
Reply

Marsh Posté le 11-04-2002 à 13:46:13   

Reply

Marsh Posté le 11-04-2002 à 13:57:15    

tu peux t'en passer si tu instancies explicitement
une ou plusieurs de tes classes templates
 
mais evidemment, la personne qui utilise le .h
ne pourra pas instancier ses classes templates
perso.  
ex: tu as instancie list<int>
donc le code pour list<int> existe et est compile
dans ton .obj, par contre personne ne pourra utilise
list<ma_class> puisqu'aucun code ne pourra etre genere
sans le gabarit de code.
 
instanciation de classe template = generation du code a partir du gabarit de code fourni.
 
A+
LEGREG

Reply

Marsh Posté le 11-04-2002 à 14:07:02    

legreg a écrit a écrit :

tu peux t'en passer si tu instancies explicitement
une ou plusieurs de tes classes templates
 
mais evidemment, la personne qui utilise le .h
ne pourra pas instancier ses classes templates
perso.  
ex: tu as instancie list<int>
donc le code pour list<int> existe et est compile
dans ton .obj, par contre personne ne pourra utilise
list<ma_class> puisqu'aucun code ne pourra etre genere
sans le gabarit de code.
 
instanciation de classe template = generation du code a partir du gabarit de code fourni.
 
A+
LEGREG  




Donc si je comprends bien il est impossible de creer un fichier .obj pour cette classe si on veut en conserver la réutilisabilité ?
 
Je crois avoir compris ce que tu veux dire. Cela signifie donc que si kkun veut utiliser ma classe avec son type de donnée il devra inclure tout le code de la classe template dans son propre code et donc il sera obligé d'inclure le cpp et le h. C'est pourquoi il reste deux méthodes :
- tout mettre dans .h et l'inclure
- inclure .h et .cpp
 
J'ai compris ! Merci de ton explication.
 
Y'a-t-il un moyen de créer un fichier pseudo objet qui conserve la réutilisabilité ?


---------------
Guerre Dollar - Euro : la chute economique des Etats-Unis avant 2010.
Reply

Marsh Posté le 11-04-2002 à 17:22:27    

Mettre tout dans le .h n'est pas trop un probleme,
c'est la solution adoptee par la STL.
 
En java il y a des conteneurs generiques,
mais ils contiennent des references
et pas des objets (tu peux faire la meme chose
en C++ via les listes de pointeurs)
 
LEGREG

Reply

Marsh Posté le 11-04-2002 à 18:26:58    

legreg a écrit a écrit :

Mettre tout dans le .h n'est pas trop un probleme,
c'est la solution adoptee par la STL.
 
En java il y a des conteneurs generiques,
mais ils contiennent des references
et pas des objets (tu peux faire la meme chose
en C++ via les listes de pointeurs)
 
LEGREG  




Merci encore pour toute ces précisions  :hello:


---------------
Guerre Dollar - Euro : la chute economique des Etats-Unis avant 2010.
Reply

Sujets relatifs:

Leave a Replay

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