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 :

liste d'objets polymphes utilisant template non defini..


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut liste d'objets polymphes utilisant template non defini..
    Bonjour à tous
    Il est tard et donc il se peut que ma question soit très simple.. mais j'en doute quand meme un peu :-)

    j'ai une classe abstraite d'Instrument
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Instrument{
    //pure virtual
    //....
    };
    une classe Portefeuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Portfolio{
    protected: 
    std::list<boost::shared_ptr<Instrument> list_;
    //.....
    };
    une classe Operation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Operation{
    //pure virtual
    virtual void applyTo(Portfolio* p, date d) = 0;
    //....
    };
    des classes templates dérivées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template <class T>
    class SOperation: public Operation{
    //.....
    void applyTo(Portfolio* p, date d);
    };

    et une classe stgy qui consiste en gros à uneliste d'Operations et qui utilise entre autres deux méthodes
    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
    class Stgy{
    //virtual
    std::list<boost::shared_ptr<Operation> > listOp_;
    
    void Stgy::applyTo(Portfolio* p, date d){
    //...
    this->buildListOperation(p, ref);
    foreach(boost::shared_ptr<Operation> op, listOp_)
    op->applyTo(p, ref);
    }
    
    double Stgy::buildListOperation(Portfolio* p, date d){
    //.....
    for (Portfolio::iterator it= p->begin(); it!= p->end(); ++it)
      addOperation(boost::shared_ptr<Operation>(new SOperation<typeid(it)>(d));
    }
    c'est dans cette derniere que se situe le noeud de mon problème
    POur chaque element de mon portefeuille je veux rajouter une operation de type SOperation (donc template) avec pour argument de template le type de l'element du portefeuille (càd l'element de la liste polymorphique)..
    Je sais qu'avec typeid on sait recuperer le type d'un element polymphq, mais ce que je ne sais pas c'est comment passer ce type comme argument d'un template...
    Si qqun voit...
    Tks
    David

  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
    Par défaut
    Ce que tu veux n'est pas directement possible. Un paramètre template doit être connu à la compilation, ce qui n'est pas ton cas ici.

    Pourquoi ne pas avoir dans fonction virtuelle dans Instrument qui retournerait une opération associée à l'instrument concret ? C'est ce qui me semble le plus simple, même si ça demande d'ajouter ce code (d'une ligne, mais quand même) dans chaque classe dérivée d'instrument.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Mais ce problème se poserait pour chaque Operation que j'inventerais alors => je devrais rajouter autant de lignes de code que j'invente d'Operations dans chaque Instrument... Ca fait pas très générique tout ca...:-/

  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
    Par défaut
    En bidouillant avec le CRTP, tu peux faire quelque chose comme ça :
    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
     
    class Operation;
    template<class T> class OperationConcrete;
     
    class Instrument
    {
    public:
       virtual ~Instrument()=0;
       virtual Operation* CreerOperation()=0;
    };
     
    template<class InstrumentT>
    struct InstrumentOperable : public Instrument
    {
    public:
       Operation* CreerOperation()
       {
          return CreerOperationConcrete<OperationConcrete>();
       }
    private:
       template<template<class > class OpT>
       OpT<InstrumentT>*CreerOperationConcrete()
       {
          return new OpT<InstrumentT>();
       }
    };
     
    class IntrumentConcret :public InstrumentOperable<IntrumentConcret>
    {
    };

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 463
    Par défaut
    Je ne suis pas un spécialiste des Design Pattern, mais moi, j'aurais implémenté ces actions avec des visiteurs.

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Je ne suis pas un spécialiste des Design Pattern, mais moi, j'aurais implémenté ces actions avec des visiteurs.
    càd?

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    En bidouillant avec le CRTP, tu peux faire quelque chose comme ça :
    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
     
    class Operation;
    template<class T> class OperationConcrete;
     
    class Instrument
    {
    public:
       virtual ~Instrument()=0;
       virtual Operation* CreerOperation()=0;
    };
     
    template<class InstrumentT>
    struct InstrumentOperable : public Instrument
    {
    public:
       Operation* CreerOperation()
       {
          return CreerOperationConcrete<OperationConcrete>();
       }
    private:
       template<template<class > class OpT>
       OpT<InstrumentT>*CreerOperationConcrete()
       {
          return new OpT<InstrumentT>();
       }
    };
     
    class IntrumentConcret :public InstrumentOperable<IntrumentConcret>
    {
    };
    Merci d'avance, je vais tenter cà ce soir ou demain..
    A+

Discussions similaires

  1. creer et utiliser une liste d'objets (TObjectList)
    Par Babylonne dans le forum C++Builder
    Réponses: 4
    Dernier message: 08/11/2007, 23h27
  2. Réponses: 10
    Dernier message: 23/10/2007, 14h02
  3. Réponses: 3
    Dernier message: 12/10/2007, 03h26
  4. [UML] utilisation langage non objet
    Par untipy dans le forum UML
    Réponses: 5
    Dernier message: 10/08/2007, 16h30
  5. Réponses: 7
    Dernier message: 30/05/2007, 16h17

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