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 :

Conversion type dans class POlymorphique


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut Conversion type dans class POlymorphique
    Bonjour à tous,

    J'ai les classes suivantes:
    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 Base{
    virtual void f();
    };
     
    class A: public Base{
    void f();
    };
     
    class B: pulbic Base{
    void f();
    };
     
    class C: public Base{
    void f();
    };
    je cherche à écrire une fonction du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Base*  mafonction (Base* ptrBase){
    if (typeid(ptrBase) == typeid(A)) return (new A);
    else if (typeid(ptrBase) == typeid(B)) return (new B);
    else if (typeid(ptrBase) == typeid(C)) return (new C);
    }
    du moins de manière plus élégante et en ne devant pas rajouter une ligne supplémemtaire chaque fois que je rajouterai un objet dérivé de la classe Base...

    Si la question est claire, est ce que qqun sait m'aider?
    Merci beaucoup
    D

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    Bonjour,

    tu cherches a créer une factory (cf pattern factory), je crois pas que ce que tu souhaite soit possible (ca se fait en Java et C# par reflexivité, mais la; peut etre Qt avec moc...).

    De ce que je connais de ce pattern je pense que t es obligé de faire comme tu fais.

    Mais peut etre qu un coup de google sue le pattern factory t en dira plus
    "vaste programme"

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    woauw ca a l'air un brin compliqué ce bazar...
    Ya pas des trucs plus simples.?

  4. #4
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par BainE Voir le message
    Qt avec moc...
    ç-à-d?

  5. #5
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    moc c'est un préprocesseur (heu en tout cas pour ce post on va faire comme si) fournit par le framework Qt (librairie graphique, de thread, XML...).
    Il me semble me souvenir qu on pouvait faire de la reflexivité (en fait ca consiste a lire le code source et invoquer des méthode dynamiquement, par leur nom en string par exemple).

    Sinon le pattern (un pattern est une "conception standardisé" pour un probleme donné) factory est pas compliqué du tout, c'est le plus simple (avec singleton).
    En fait tu le fais deja sans le savoir.
    "vaste programme"

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Pourquoi pas quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Base {
      virtual Base* clone() = 0;
    };
     
    class A: public Base {
      virtual Base* clone() { return new A(); }
    };
    ?

    Si c'est pas un vrai clone tu peux l'appeler instanciate, create, ...

    MAT.

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Mais si maintenant je rajoute une classe D qui dérive aussi de Base, je suis obligé de rajouter dans la définition de D la solution que tu me proposes...?

    Si c'est le cas, je voudrais l'éviter, car dans mon code, il a beaucoup de chance que je doive rajouter des classes assez souvent....

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Une solution alors serait de factoriser la fonction dans une classe template :
    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
    class Base
    {
    public:
      virtual Base* create() const = 0;
    };
     
    template<class T>
    class Derived : public Base
    {
    public:
      virtual Base* create() const {return new T;}
    };
     
    class A : public Derived<A>
    {
    };
     
    class B : public Derived<B>
    {
    };

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    J'aurais fait un peu différemment (un peu plus simple je crois):
    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
    template<class T>
    class Base
    {
    public:
       virtual ~Base();
       static T* create() { return new T; }
       virtual void f() {}
    };
     
    class A : public Base<A>
    {
    public:
       void f();
    };
     
    class B : public Base<B>
    {
    public:
       void f();
    };
    Qui s'utilise ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    A* pA = Base<A>::create();
    B* pB = Base<B>::create();
    Mais au final, ce n'est rien de plus qu'un pattern factory "templaté".


    edit: rajouté l'héritage avec, comme exemple, la fonction f()
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    La différence, quand même, c'est qu'on perd le polymorphisme dynamique (A et B ne dérivent plus de la même classe).

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    113
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 113
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    La différence, quand même, c'est qu'on perd le polymorphisme dynamique (A et B ne dérivent plus de la même classe).
    CE que je ne veux pas perdre... :-/

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    La différence, quand même, c'est qu'on perd le polymorphisme dynamique (A et B ne dérivent plus de la même classe).
    En un sens oui. Mais concrètement, qu'y perdons-nous?

    En fait, je pense que concrètement ça va dépendre du contexte. D'un point de vue "conceptuel", ma proposition n'est pas belle, car je fusionne la factory et l'interface, mais dans la pratique, si l'interface n'a pas vocation à être plus qu'une interface et que celle-ci reste simple, je pense que ça reste une bonne solution. Je reste un adepte du rasoir d'Ockham.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

Discussions similaires

  1. faire de l'aller-retour dans class Polymorphique
    Par dhoorens dans le forum C++
    Réponses: 5
    Dernier message: 20/08/2008, 22h12
  2. Conversion type fils dans type pere
    Par Dr@ke dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2007, 16h36
  3. 2 objets de même type dans une classe
    Par _R3nO_ dans le forum Hibernate
    Réponses: 2
    Dernier message: 28/02/2007, 16h12
  4. [.NET2.0][C#]Passage type de classe dans une fonction
    Par SLE dans le forum Windows Forms
    Réponses: 4
    Dernier message: 06/06/2006, 15h48
  5. Conversion de type dans une requete
    Par charleshbo dans le forum Access
    Réponses: 9
    Dernier message: 17/02/2006, 18h14

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