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

Langage C++ Discussion :

Pb template liste generique


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Pb template liste generique
    Je suis entrain d'essayer de creer une liste generique, mais j'ai quelques pb avec les templates.
    Voila la classe:

    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
     
    #ifndef HEADER_LIST
    #define HEADER_LIST
     
    #include <iostream>
    using namespace std;
    // Classe liste
     
    template <class T> class List {
     
        private:
            T m_val;
            List<T> *m_next;
     
        public:
            List() ;
            List(const List<T>&) ;
            ~List();
            void addTail(T);
    }...
    Le source qui va avec :
    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
     
    #include "list.h"
     
    //Methods canonic Copelian Form
     
    template <class T>
    List<T>::List(){
        m_next = NULL;
    }
     
     
    template <class T>
    List<T>::List(const List &l){
        if (l.m_next == NULL) m_next = NULL;
        else{
            while (l.m_next != NULL){
                addTail(l.m_val);
            }
        }
    }
     
     
    template <class T>
    List<T>::~List(){
        if (m_next != NULL) delete m_next;
    }
     
     
    template <class T>
    void
    List<T>::addTail(T element){
        List<T> *newElem = new List;
        newElem->m_next;
        newElem->m_val = element;
     
        m_next = newElem;
    }
    Le main

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #include "list.h"
     
    int main(){
        List<int> my_list;
     
        my_list.addTail(2);
        //my_list.addTail(1);
     
        return 0;
    }
    et a la compilation :
    main.cpp.text+0x195): undefined reference to `List<int>::List()'
    main.cpp.text+0x1a8): undefined reference to `List<int>::addTail(int)'
    main.cpp.text+0x1b8): undefined reference to `List<int>::~List()'
    main.cpp.text+0x1ce): undefined reference to `List<int>::~List()'

    c'est la premiere fois que j'utilise les templates alors... J'aurais besoin d'aide
    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Merci mais...
    Ben j'ai deja lu les FAQ, mais se que je voudrais savoir c'est se qui va pas dans mon programme...

    J'arrive pas a trouver l'erreur...

  4. #4
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Merci pour l'aide
    En fait merci, j'ai pigé, je pensais avoir un probleme au niveau du code et pas de la compilation... .
    Ducoup c'est bon tout fonctionne.
    Merci encore.

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut, et bienvenue sur le forum.

    Ceci dit, et d'un point de vue purement sémantique...

    La liste est normalement le conteneur qui va fournir les différentes possibilités de... gestion du contenu.

    C'est à dire que la liste va permettre d'ajouter, d'insérer, de retirer ou de rechercher des éléments.

    Or, dans le code que tu présente, ce n'est pas ce que va faire ta classe template List: elle représente... le contenu (l'élément de la liste, en quelque sorte )

    D'un point de vue purement sémantique, il serait donc utile / intéressant d'utiliser des termes qui ne mentiront pas à l'utilisateur.

    Il faudrait donc plutot envisager quelque chose comme
    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
    /* les éléments de la liste */
    template <class T>
    class ElementList
    { 
        private:
            T m_val;
            ElementList<T> *m_next;
     
        public:
            ElementList() ;
            ElementList(const List<T>&) ;
            ~ElementList();
            /* une version constante et une autre non constante, pour le cas où */
            ElementList& next();
            const ElementList& next() const;
     
    };
    /* la liste en elle même */
    template <class T>
    class List
    {
        typedef ElementList<T>* ptrElem; /* par facilité */
        private:
            ptrElem m_first; // le premier élément de la liste
            ptrElem m_last; // le dernier élément de la liste 
            size_t m_size; // il est toujours sympa de pouvoir avoir le nombre 
                           // d'elements
     
        public:
            List() ;
            List(const List<T>&) ;
            ~List();
            void addTail(T);
            void addHead(T);
            void insertAfter(T);
            size_t size() const;
    }

  6. #6
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Bof, question de définition.

    Une liste est souvent définie par induction structurelle. A partir des règles suivantes :
    - l'ensemble vide {} est une liste d'entiers
    - si n est un entier et L est une liste, alors le couple (n, L) est une liste d'entiers.
    Et on définit l'ensemble des listes d'entiers comme le plus petit ensemble clos par l'application de ces règles.

    Là, tu vois bien que c'est une liste.
    1, 2, 3, 4 <=> (1, (2, (3, (4, {}))))

    Une liste est donc une valeur au même titre qu'un entier, et on applique des fonctions et traitements sur cette liste.

    Et tu te rends compte que la liste définie par luffy.luck correspond bien à la définition (et même plus... tu peux avoir des listes infinies, en faisant des cycles).

    Par contre, le problème en C++ c'est que faire une classe comme ça a une sémantique d'entité, et qu'il faut gérer la mémoire.

    Ca explique tout le design des classes de la STL comme std::list, std::set, std::map.

    Remarque, si on fait tout avec des boost::shared_ptr, en programmant sans effets de bord (naturellement par récursion), ça optimise l'espace mémoire parce que tout est partagé, et l'ensemble des listes manipulées peut s'entrelacer jusqu'à faire un graphe.

Discussions similaires

  1. Affichage champ template list
    Par sauceaupistou dans le forum SharePoint
    Réponses: 1
    Dernier message: 13/05/2008, 10h18
  2. template list pair map
    Par blackfiever dans le forum Langage
    Réponses: 6
    Dernier message: 01/01/2008, 18h25
  3. Réponses: 2
    Dernier message: 04/07/2007, 17h12
  4. Pb avec template list
    Par olive_le_malin dans le forum Langage
    Réponses: 10
    Dernier message: 16/11/2006, 02h05
  5. Fuite de mémoire en utilisant le template list
    Par schtroumpf_farceur dans le forum Langage
    Réponses: 9
    Dernier message: 18/07/2005, 20h44

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