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 Simple Générique


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut Liste Simple Générique
    Bonjour, je suis encore à ma liste, seulement cette fois j'essaye de la rendre generique j'ai fais comme ceci :
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    #ifndef __LISTE__
    #define __LISTE__
     
    #include <iostream>
     
    /*la classe Noeud contient la valeur stocké dans la liste et le pointeur vers l'element suivant*/
    template<typename T>
    class Noeud
    {
    	/*pour utiliser dans la classe Iterator la classe noeud sans passer par les getteurs et setteurs*/
    	friend class Iterator;
    	friend class IteratorW;
     
    	private:
    		T val;
    		Noeud *suivant;
     
    	public:
    		Noeud(const Noeud &n)
    		{
    			Noeud no(n);
     
    			std::swap(this->val, no.val);
    			std::swap(this->suivant, no.suivant);
    		}
     
    		Noeud(T val, Noeud *n = NULL) : val(val), suivant(n)
    		{
    		}
     
    		T getVal()const
    		{
    			return this->val;
    		}
     
    		Noeud* getSuivant()const
    		{
    			return this->suivant;
    		}
     
    		void setVal(const T &val)
    		{
    			this->val = val;
    		}
     
    		void setSuivant(Noeud *n)
    		{
    			this->suivant = n;
    		}
     
    		Noeud& operator=(const Noeud &n)
    		{
    			Noeud tmp = n;
     
    			std::swap(this->val, tmp.val);
    			std::swap(this->suivant, tmp.suivant);
     
    			return *this;
    		}
    };
     
    /*classe qui contient un élément de tete et quelques fonctions sur les listes comme l'empilage et le depilage*/
    /*ici les méthodes n'ont pas a etre inline*/
    template<typename T>
    class Liste
    {
    	/*idem que la classe Noeud*/
    	friend class Iterator;
     
    	private:
    		Noeud<T> *tete;
     
    	public:
    		Liste();
    		Liste(const Liste<T> &l);
    		~Liste();
     
    		void Empiler(T val);
    		T Depiler();
     
    		void Enfiler(T val);
    		T Defiler();
     
    		friend std::ostream& operator<<(std::ostream &o, const Liste<T> &l);
    		Liste<T>& operator=(const Liste<T> &l);
    };
     
    /*classe qui permet de se déplacer librement dans la liste sans avoir a toucher à la tete de liste de la classe Liste*/
    template<typename T>
    class Iterator
    {	
    	protected:
    		Noeud<T> **courant;
    		Liste<T> *liste;
     
    	public:
    		Iterator(const Iterator<T> &i) : courant(i.courant), liste(i.liste)
    		{
    		}
     
    		Iterator(const Liste<T> &l)
    		{
    			liste = const_cast<Liste<T>*> (&l);
    			Liste<T> *laux = const_cast<Liste<T>*> (&l);
    			this->courant = &(laux->tete);
    		}
     
    		/*verifie que l'element suivant existe : si le pointeur courant == null => pas d'element suivant*/
    		bool hasNext()const
    		{
    			return ((*courant) == NULL) ? false : true;
    		}
     
    		/*obtenir l'element suivant*/
    		void getNext()
    		{
    			courant = &((*courant)->suivant);
    		}
     
    		/*retourne l'entier stocke dans le noeud courant de la liste*/
    		T getCurrent()const
    		{
    			return (*courant)->val;
    		}
     
    		/*retourne au debut de la liste*/
    		void rewind()
    		{
    			courant = &(liste->tete);
    		}
     
    		/*incrementation => raccourcis de getNext()*/
    		Iterator& operator++()
    		{
    			this->getNext();
    			return *this;
    		}
    };
     
    /*classe qui permet de faire des modifications sur la liste a partir d'un iterateur*/
    template<typename T>
    class IteratorW : public Iterator<T>
    {
    	public:
    		IteratorW(const IteratorW &i) : Iterator<T>(i)
    		{
    		}
     
    		IteratorW(const Liste<T> &l) : Iterator<T>(l)
    		{
    		}
     
    		void Inserer(T val)
    		{
    			*this->courant = new Noeud<T>(val, (*this->courant));
    		}
     
    		void Supprimer()
    		{
    			Noeud<T> *aux = *this->courant;
    			*this->courant = (*this->courant)->suivant;
    			delete aux;
    		}
    };
     
    #endif
    le problème est qu'à la compilation j'ai ces messages d'erreur de Visual C++ :
    Erreur 2 error C3857: 'Iterator'*: plusieurs listes de paramètres modèle ne sont pas autorisées c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 89
    Erreur 6 error C3857: 'Iterator'*: plusieurs listes de paramètres modèle ne sont pas autorisées c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 89
    Erreur 1 error C2989: 'Iterator'*: le modèle de classe a déjà été déclarée comme modèle sans classe c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 138
    Erreur 5 error C2989: 'Iterator'*: le modèle de classe a déjà été déclarée comme modèle sans classe c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 138
    Erreur 4 error C3857: 'IteratorW'*: plusieurs listes de paramètres modèle ne sont pas autorisées c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 141
    Erreur 8 error C3857: 'IteratorW'*: plusieurs listes de paramètres modèle ne sont pas autorisées c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 141
    Erreur 3 error C2989: 'IteratorW'*: le modèle de classe a déjà été déclarée comme modèle sans classe c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 164
    Erreur 7 error C2989: 'IteratorW'*: le modèle de classe a déjà été déclarée comme modèle sans classe c:\users\...\document\visual studio 2005\projects\tlist\listegen\liste.h 164
    Donc si j'ai bien compris c'est un problème au niveau des templates, je suppose que l'erreur se trouve au niveau de la déclaration des classes amies mais je n'arrive pas à les déclarer correctement

    je donne aussi le message de G++ même si je compile sous Visual C++
    et G++ me sort :
    Liste.h:84: warning: friend declaration `std::ostream& operator<<(std::ostream&,
    const Liste<T>&)' declares a non-template function
    Liste.h:84: warning: (if this is not what you intended, make sure the function t
    emplate has already been declared and add <> after the function name here) -Wno-
    non-template-friend disables this warning
    Liste.h: In instantiation of `Liste<int>':
    main.cpp:8: instantiated from here
    Liste.h:66: error: template argument required for `struct Iterator'
    Voila est ce que quelqu'un a une idée ?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Quand tu indiques l'amitié, tu dois préciser que Iterator et IteratorW sont des classes génériques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<typename T>
    class Noeud
    {
    	/*pour utiliser dans la classe Iterator la classe noeud sans passer par les getteurs et setteurs*/
    	template<class U> friend class Iterator;
    	template<class U> friend class IteratorW;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<typename T>
    class Liste
    {
    	/*idem que la classe Noeud*/
    	template<class U> friend class Iterator;
    et pour l'opérateur << :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          template<class U>
    		friend std::ostream& operator<<(std::ostream &o, const Liste<U> &l);

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    merci pour la précision mais j'ai encore une question ?
    Pourquoi rajouter un type U, type T ne suffit pas ?

    Ceci dit j'ai modifier comme indiqué a présent j'ai une erreur à l'édition de lien
    Erreur 1 error LNK2019: symbole externe non résolu "public: __thiscall Liste<int>::~Liste<int>(void)" (??1?$Liste@H@@QAE@XZ) référencé dans la fonction _main main.obj
    Erreur 2 error LNK2019: symbole externe non résolu "public: void __thiscall Liste<int>::Empiler(int)" (?Empiler@?$Liste@H@@QAEXH@Z) référencé dans la fonction _main main.obj
    Erreur 3 error LNK2019: symbole externe non résolu "public: __thiscall Liste<int>::Liste<int>(void)" (??0?$Liste@H@@QAE@XZ) référencé dans la fonction _main main.obj
    Erreur 4 fatal error LNK1120: 3 externes non résolus C:\Users\...\Document\Visual Studio 2005\Projects\TList\Debug\ListeGen.exe
    Si j'ai bien compris le message, il ne trouve pas le constructeur par défaut et le destructeur, pourtant la déclaration dans le cpp est conforme a la déclaration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T> 
    Liste<T>::Liste(const Liste<T> &l){...}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /*et si je déclare le constructeur par défaut dans le .h comme ceci*/
    Liste<T>();
    /*et si je fais comme ci dans le .cpp*/
    template<typename T> 
    Liste<T>::Liste<T>(const Liste<T> &l){...}
    ben sa ne marche pas mieux
    comment je dois faire pour m'en sortir ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T> class Noeud
    T s'applique à la classe noeud.
    Toi tu veux dire que Iterator est aussi une classe template (dont le paramètre n'a à priori rien à voir avec T), donc tu dis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class U> friend class Iterator;
    Il s'agit juste d'une déclaration qui indique au compilateur que la class Iterator est une classe générique avec 1 argument. Tu peux tout aussi bien écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class> friend class Iterator;

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    d'accord, est ce que tu as une piste pour le problème d'édition de lien ?

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par amateurc Voir le message
    d'accord, est ce que tu as une piste pour le problème d'édition de lien ?
    F.A.Q. : Pourquoi mes templates ne sont-ils pas reconnus à l'édition des liens ?
    En gros, la définition du template doit être inclue avec sa déclaration.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    merci beaucoup pour ton aide, maintenant la Liste semble fonctionner sans bug

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    ?

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Points : 80
    Points
    80
    Par défaut
    héhé oui

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. parcourir une pile (liste simple chaînée)
    Par rutabagas dans le forum C
    Réponses: 3
    Dernier message: 04/10/2007, 16h08
  2. Liste simple et à choix multiples
    Par Enfa dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/07/2007, 09h41
  3. ajout d'un 'item' à une liste simple
    Par denisvignes dans le forum Access
    Réponses: 8
    Dernier message: 26/09/2006, 15h41
  4. Liste simple
    Par aliburotic dans le forum Access
    Réponses: 3
    Dernier message: 31/01/2006, 00h37
  5. Listes Simples et propriétés / Glisser déposer
    Par MeRc|LeSs dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 03/12/2005, 23h14

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