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 :

Template / Conteneur / Objets Polymorphiques


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut Template / Conteneur / Objets Polymorphiques
    Je dois créer une classe template de liste.
    Je n'avais pas prévu à la base qu'elle gère polymorphismeet dans un main de test fournit par le prof, je me suit fait avoir.... tout mes objets utilisaient ma fonction affichage de la mère.
    La classe prend des objets en insertion et duplique chaque objet dans une classe noeud.
    Seulement cette classe noeud est paramétrée sur la classe template qui est paramétrée sur le type de base. Donc quand je duplique un objet pour le stocker, j'utilise le constructeur de copie de la base et ce même si je lui passe un objet fille. Cela ne m'interesse pas du tout.
    J'ai vu le pattern design clone et je voudrais y échapper.
    Voici le code de la classe qui crée mes noeuds. Tout y est passé par référence (par des classe templates qui héritent de ma classe template file) sauf l'adresse du noeud suivant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template<class T> Noeud<T>::Noeud(const T& obj, Noeud* pNext)
    {
        value = //Je voudrais dupliquer obj que ce soit une fille ou non !
        next = pNext;
    }
    template<class T> Noeud<T>::~Noeud()
    {
        delete value;
    }
    Des idées ? Merci d'avance ....

    J'aime p-ô les templates, c'est mal geré :/

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonsoir,
    Telle que je le vois, à moins d'avoir mal compris quelque chose, tu ne pourra pas échapper au clonage...
    Pour allouer "value", il faudrait connaitre le type "réel" de obj. Il n'est pas impossible de faire un gros switch avec des typeid, mais il est plus simple a mon avi de juste faire une petite fonction clone() a chacune de tes class héritant du type de base.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //par exemple:
    MonType* MonType::clone()
    {
      return new MonType(*this);
    }
     
    //et après:
    template<class T> Noeud<T>::Noeud(const T& obj, Noeud* pNext)
    {
        value = obj.clone();
        next = pNext;
    }
    [EDIT]
    Sinon une autre solution serai de garder un pointeur sur obj, et de na pas faire de copie.

  3. #3
    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
    Par défaut
    Une solution pour éviter le clonage (mais pourquoi vouloir l'éviter?) en tirant profit des templates:
    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
    template<typename Derive>
    class Base
    {
    public:
       typedef Derive type;// type reel a instancier.
       Base(){
       }
       Base(const Base&){
          std::cout<<"Base"<<std::endl;
       }
    };
    // spécialisation partielle uniquement si tu as besoin d'instancier Base
    template<>
    class Base<void>
    {
    public:
       typedef Base type;
       Base(){
       }
       Base(const Base&){
          std::cout<<"Base"<<std::endl;
       }
    };
     
    class Derive1 :public Base<Derive1>
    {
    public:
       Derive1(){
       }
       Derive1(const Derive1&){
          std::cout<<"Derive1"<<std::endl;
       }
    };
     
    class Derive2 :public Base<Derive2>
    {
    public:
       Derive2(){
       }
       Derive2(const Derive2&){
          std::cout<<"Derive2"<<std::endl;
       }
    };
     
    template<class T>
    T* Nouveau(const T*P_t)
    {
       return new T::type(*P_t);
    }
     
    int main(int argc, char **argv)
    {
       Base<void> base;
       Derive1 b;
       Derive2 c;
       std::cout<<"clonage"<<std::endl;
       delete Nouveau(&base);
       delete Nouveau(&b);
       delete Nouveau(&c);
     
       return 0;
    }
    On trouve dans boost des choses comme ça.

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2005
    Messages : 87
    Par défaut
    Tout d'abord merci de m'avoir répondu !
    Il est vrai que le pattern clone est sympathique mais il m'obligerais à rajouter la méthode dans pas mal de mes classe.

    3DArchi, pour reproduire ton code, la classe que je souhaite stocker dans ma liste doit être template ? afin de pouvoir utiliser un typedef adapté ?

    Ca ne m'avance pas. Je vais en parler à mon prof dès que possible histoire de voir si il veux que je creuse l'histoire jusqu'au bout ou pas.

    Dans tout les cas, merci de me citer boost! Depuis que je cherche à comprendre plusieurs principes moin courant je vais lire le code de boost et de la stl!

    Merci encore, j'espère avoir une réponse de mon prof bientôt

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Au passage, le pattern en question s'appelle prototype, pas clone...

  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
    Par défaut
    Citation Envoyé par Haknaton Voir le message
    3DArchi, pour reproduire ton code, la classe que je souhaite stocker dans ma liste doit être template ? afin de pouvoir utiliser un typedef adapté ?
    Non, juste la classe de base qui sert en fait de Meta-fonction pour obtenir le vrai type ton noeud.

Discussions similaires

  1. [POO] Génération d'objets sur template
    Par Elboras dans le forum Langage
    Réponses: 3
    Dernier message: 09/07/2007, 18h30
  2. test objet dans un conteneur
    Par kohsaka dans le forum VB.NET
    Réponses: 2
    Dernier message: 04/06/2007, 13h20
  3. Conteneur générique et types des objets contenus
    Par bobuse dans le forum Langage
    Réponses: 4
    Dernier message: 12/04/2007, 11h59
  4. Réponses: 2
    Dernier message: 08/12/2006, 01h20
  5. [Debutant][Conception] visibilité des objets de type conteneur
    Par thebloodyman dans le forum Général Java
    Réponses: 10
    Dernier message: 04/01/2006, 12h44

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