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

SL & STL C++ Discussion :

[STL] std::list de classe et de ses derivées


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut [STL] std::list de classe et de ses derivées
    Bonjour,

    Voila mon souci :

    J'ai une classe cBoite, une classe cCube, et d'autres qui derivent toutes de la classe cObjet.

    J'ai une classe cConteneur qui derive elle aussi de cObjet.

    La classe cConteneur a comme membre une liste des objets qu'elle contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class cConteneur : public cObjet
    {
       public:
            std::list<cObjet*> m_listeObjets;
     
       public:
            void afficherObjets();
            void trierObjets()
            .....
    }
    Jusqu'ici tout va bien....

    Seulement, certains de mes conteneurs (qui derivent de la classe cConteneur) ne sont prevus pour ne contenir que des cubes (par exemple)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class cConteneurCube : public cConteneur
    {
            .....
    }
    Je souhaiterais donc :
    - que la liste d'objets devienne une liste de cubes : std::list<cCube*> m_listeObjets
    - eviter de re-coder les méthodes "afficherObjets", "trierObjets".... qui parcourent la liste d'objets avec des itérateurs

    Quelle serait la méthode la plus simple/la plus propre ?
    Avec des templates ?
    J'ai jamais codé de template, quels sont les pièges à eviter ?

    Merci !

    EDIT :

    Pour preciser ma pensée, voila comment je vois les choses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    La classe cConteneur contient par defaut des cObjet :
     
    class cConteneur<class C=cObjet> : public cObjet
    {
       public:
            std::list<C*> m_listeObjets;
     
       public:
            void afficherObjets();
            void trierObjets()
            .....
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    La classe cConteneurCube dérive de cConteneur mais contient des cCube :
     
    class cConteneurCube : public cConteneur<cCube>
    {
            .....
    }
    Mais je ne sais pas trop comment l'ecrire...

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <typename T = cObjet>
    class cConteneur : public cObjet
    {
    protected :
        std::list<T*> m_listeObjets;
        ...
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class cConteneurCube : public cConteneur<cCube>
    {
     
    };
    Par contre tu ne pourras plus écrire cConteneur, il faudra écrire cConteneur<>. Donc au pire tu peux nommer ta classe de base cConteneurBase, et faire de cConteneur une spécialisation comme les autres (dérive de cConteneurBase<cObjet>).

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Merci !

    Par contre, pour mes fonctions qui utilisent la liste et des itérateurs, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void cConteneur::afficherObjets()
    {
        if(m_listeObjets.empty()) return;
     
        std::list<cObjet*>::iterator It;
        for(It=m_listeObjets.begin();It!=m_listeObjets.end();It++)
            (*It)->afficher();
    }
    Ca devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void cConteneur::afficherObjets()
    {
        if(m_listeObjets.empty()) return;
     
        std::list<T*>::iterator It;
        for(It=m_listeObjets.begin();It!=m_listeObjets.end();It++)
            (*It)->afficher();
    }
    Et ça marche tant que le type T dérive de "cObjet" qui implémente la méthode "afficher()" ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Et ça marche tant que le type T dérive de "cObjet" qui implémente la méthode "afficher()" ?
    Oui.
    Par contre il faudra remplacer tes "std::list<T*>::iterator" par "typename std::list<T*>::iterator". Voir FAQ pour plus de détails.

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Ok !

    Merci pour toutes ces précisions !

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

Discussions similaires

  1. std::list d'une class Template
    Par Sentenza31 dans le forum Débuter
    Réponses: 2
    Dernier message: 15/09/2010, 18h09
  2. [dev-C++]std::list<tree_node<T>*> iterator;
    Par jmv dans le forum Dev-C++
    Réponses: 7
    Dernier message: 06/05/2005, 13h14
  3. acceder au n iéme element d'une liste std::list
    Par sorari dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/03/2005, 15h21
  4. [std::list][find_if] problème avec mes foncteurs
    Par n!co dans le forum SL & STL
    Réponses: 12
    Dernier message: 04/02/2005, 11h56
  5. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02

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