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 :

Regroupement de classe polymorphiques


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 Regroupement de classe polymorphiques
    Bonjour à tous

    J'ai à ma disposition un ensemble de classe polymorphiques

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class A: public M{
    virtual T_A data_A_
    void setData (T_A)
    ...
    };
     
    class B:public A{
    T_B data_B_
    B(T_B) // constructeur
    ...
    };
    où T_A et T_B sont des types (peu importe)

    Actuellement je peux écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    T_B data_B;
    B b(data_B);  // je construis mon objet B dérivé de A
    T_A data_A1;
    b.setData(data_A1); // j'assigne data_A1 dans la structure mère A
    Si je rajoute la ligne suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T_A data_A2
    b.setData(data_A2);
    ça va fonctionner mais je vais écraser data_A1
    Ca ne m'arrange (évidemment) pas !!!

    Ce que je voudrais faire, c'est initialiser mon objet B avec ses données membres (de type data_B), mais pouvoir avoir deux sets de données data_A (donc sans écrasement de data_A1)


    Les contraintes que j'ai sont:
    Je ne peux pas toucher au code de A et B pcq ce n'est pas developpé par moi et je suis dépendant des éventuels releases futures


    Voici donc les solutions que j'ai trouvé jusqu'à présent:
    1ère solution:
    modif de la classe A:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class A: public M{
    T_A data_A1_;
    T_A data_A2_;
    void setData1(T_A);
    void setData2(T_A);
    ...
    };
    ca devrait fonctionner mais ca ne satisfait pas à ma contrainte...:-/

    2ème solution:
    création d'une classe "regroupement"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class X{
    A a1_;
    A a2_;
    };
    ça devrait aussi fonctionner mais là par contre je ne vois du tout comment écrire un objet de type B tel que:
    * les données de type data_B passe dans la structure B
    * je puisse passer faire varier les variables de type T_A

    3ème solution:
    la votre :-)

    David

  2. #2
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 900
    Points : 1 918
    Points
    1 918
    Par défaut
    Citation Envoyé par dhoorens Voir le message
    Je ne peux pas toucher au code de A et B pcq ce n'est pas developpé par moi et je suis dépendant des éventuels releases futures
    Citation Envoyé par dhoorens Voir le message
    modif de la classe A:

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par dhoorens Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class A: public M{
    virtual T_A data_A_
    ...


    Citation Envoyé par dhoorens Voir le message
    Ce que je voudrais faire, c'est initialiser mon objet B avec ses données membres (de type data_B), mais pouvoir avoir deux sets de données data_A (donc sans écrasement de data_A1)


    Moi je suis très bête, tu pourrais nous donner un exemple de ce que tu veux faire avec avec des int et des float ? Et préciser ce que tu entends par "set de données" ?

  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 Noxen Voir le message
    Ben c'était pour proposer une solution :-)

  5. #5
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Si j'ai bien compris, ton problème est que data_B_ est initialisé à la construction et ensuite tu n'as pas d'interface pour le modifier (au contraire de data_A_).
    Bon, comment est gérer l'opérateur = par class B?

  6. #6
    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 3DArchi Voir le message
    Si j'ai bien compris, ton problème est que data_B_ est initialisé à la construction et ensuite tu n'as pas d'interface pour le modifier (au contraire de data_A_).
    Bon, comment est gérer l'opérateur = par class B?
    Il n'a pas d'operateur = défini au niveau de class B
    Par contre cet operateur est defini au niveau de class O1 avec O1 tel que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class O1{};
    class O2{};
    class M: public O1, public O2{};
     
    class A: public M{
    //classe abstraite telle que definie plus haut
    };

  7. #7
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Il n'y a pas de solution miracle.

    Si ton B ne pet contenir qu'une seule copie de T_A alors il n'en contiendra qu'une seule.

    Si tu veux qu'il puisse contenir 2 copies de T_A différents il te faut modifier setData et utiliser un vector.

    Ceci dit, j'ai bien mis en évidence que dans ton code actuel tel que tu le montres, tu fais des copies à chaque fois.

    Donc si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    T_A t_a1;
    T_A t_a2;
    b.setData(t_a1);  // &b.t_a != t_a1
    b.setData(t_a2);
    b contiendra à la fin de code effectivement une copie de t_a2 mais t_a1 sera toujours existant.

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/03/2009, 18h13
  2. faire de l'aller-retour dans class Polymorphique
    Par dhoorens dans le forum C++
    Réponses: 5
    Dernier message: 20/08/2008, 22h12
  3. Conversion type dans class POlymorphique
    Par dhoorens dans le forum C++
    Réponses: 11
    Dernier message: 18/06/2008, 14h49
  4. Réponses: 4
    Dernier message: 21/05/2006, 21h01
  5. Réponses: 8
    Dernier message: 18/04/2006, 12h16

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