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 :

Problème de conception


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Problème de conception
    Hello,

    Soient l'héritage suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct A
    {
    };
     
    struct B : public A
    {
    };
    Je voudrais avoir un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Foo_A
    {
        A member;
    };
     
    struct Foo_B : Foo_A
    {
        B member;    // avec B cachant A
    };
    Fonctionnellement, ça a l'air de faire l'affaire, sauf que je Foo_A doit contenir des fonctions travaillant sur member (appel de fonctions virtuelles (ou CRTP)...).
    Je pourrais mettre un pointeur, mais je devrais l'instancier en tant que A dans le constructeur de Foo_A, puis éventuellement le réinitialiser en tant que B dans Foo_B.
    Ou alors que Foo_B passe un pointeur de B au constructeur de Foo_A pour un argument qui par défaut serait initialisé par une instanciation de A.
    Ça ressemble un peu au patron "Pont", mais ce n'est guère satisfaisant, et peu élégant. En outre, je ferais du dynamique alors que j'ai une connaissance préalable du type de membre souhaité, ce qui devrait conduire à utiliser du statique.
    Ce qui peut m'amener aux classes de politique, mais je me retrouve confronté au même problème : la politique de la classe fille devant écraser celle de la classe mère.

    J'ai l'impression que la solution est simple, mais que je me suis posé trop de questions, et que ça m'a embrouillé...

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En principe, tu as deux possibilités: la template et la variable.

    Tu veux quelque chose qui change via l'héritage.

    Je reprends avec des noms réels: A et B deviennent Police et PoliceConcrete, qui hérite de Police. J'imagine que tu pourrais avoir un C: AutrePoliceConcrete.

    Avec les polices, tu n'as normalement pas d'héritage dans les utilisateurs.

    Ca donnerait quelque chose commec a:mais la police devra survivre à l'instance de Bidule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Bidule {
    private:
        Police& police;
    public:
        Bidule(Police& police): police(police) {}
    }
    Nous avons au moins un cours sur l'usage des polices, je l'avais lu il y a quelques mois, mais je ne sais plus duquel il s'agit exactement

    En tenant à l'héritage dans les bidules, ça donnerait plutôt, a mon sens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Bidule {
    protected:
        Police& police;
        Bidule(Police& police): police(police) {}
    public:
        Bidule() : police(PoliceConcrete()) {}
    };
     
    class SuperBidule : public Bidule{
    public:
        SuperBidule() : Bidule(AutrePoliceConcrete()) {}
    };
    Dans les deux cas, tu utilise le fait qu'une référence est polymorphique, mais statique.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par leternel Voir le message
    Je reprends avec des noms réels: A et B deviennent Police et PoliceConcrete, qui hérite de Police. J'imagine que tu pourrais avoir un C: AutrePoliceConcrete.
    POur info, dans mon exemple, A et B doivent toutes deux être instanciables, et donc concrètes.

    Citation Envoyé par leternel Voir le message
    Dans les deux cas, tu utilise le fait qu'une référence est polymorphique, mais statique.
    Cette dernière phrase me laisse perplexe, mais ton histoire de référence m'ouvre effectivement une piste.

    edit :
    Citation Envoyé par leternel Voir le message
    mais la police devra survivre à l'instance de bidule
    En fait, après passage de mon code, ce n'est pas possible. Du moins, sémantiquement, ça n'a pas de sens.
    Il faut donc passer par un pointeur...
    Mais ça voudrait dire que je devrais dupliquer le constructeur de A : une version pour l'instanciation directe, qui initialise le pointeur, et une version protégée appelée par le classe fille, et qui prend une valeur pour le pointeur.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Les références sont polymorphiques, au sens que les fonctions virtuelles sont gérées, comme pour les pointeurs, et contrairement aux variables simples.

    J'insiste encore, il faut faire très attention, dans le premier exemple, à la durée de vie de la police référencé. Le risque est la dangling reference

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il existe une autre manière de faire, à base de template, mais je ne me souviens pas de la forme canonique.
    D'où mon renvoi aux cours. Regarde du coté des design patterns

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Apparemment, j'arrive à m'en sortir avec un membre référence initialisé en déréférençant un pointeur construit à la volée dans l'initialisation.
    En utilisant un pointeur intelligent, ça devrait faire l'affaire.

  7. #7
    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
    Citation Envoyé par oodini Voir le message
    Fonctionnellement, ça a l'air de faire l'affaire, sauf que je Foo_A doit contenir des fonctions travaillant sur member (appel de fonctions virtuelles (ou CRTP)...).
    [...]
    En outre, je ferais du dynamique alors que j'ai une connaissance préalable du type de membre souhaité, ce qui devrait conduire à utiliser du statique.
    Je trouve ces deux phrases contradictoires...
    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.

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je trouve ces deux phrases contradictoires...
    Tu fais référence à l'appel de fonctions virtuelles ?
    Si oui, et que la piste envisagée est le statique, j'avais précisé la possibilité du CRTP.

Discussions similaires

  1. Méthode Finalize et problème de conception
    Par phryos dans le forum Langage
    Réponses: 4
    Dernier message: 19/04/2006, 11h04
  2. [VB6][UserControl et OCX]Problème de conception
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 19/01/2006, 22h37
  3. Petit problème de conception sur access
    Par coooookinette dans le forum Modélisation
    Réponses: 3
    Dernier message: 18/12/2005, 18h24
  4. Gestion des départements problème de conception
    Par snoopy69 dans le forum Modélisation
    Réponses: 7
    Dernier message: 11/10/2005, 13h08
  5. Problème de conceptions de tables
    Par dtavan dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/05/2004, 23h13

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