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 :

Pb conception


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut Pb conception
    Bonjour,

    j'ai un petit souci de conception et mon problème n'est pas forcemment complexe mais long à expliquer.C'est pourquoi j'ai découpé le problème en morceaux.

    Introduction:
    Mon objectif est d'afficher/modifier dans un controle graphique les differents champs de mes objets.
    Pour cela j'utilise un controle MFC de type EPropCtrl avec une classe IPropertyHost definie de la manière suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class IPropertyHost
    {
    public:
        virtual void GetProperties( EPropList& PropList ) {}
    };
     
    // mon controle graphique (ressemble a un listBox)
    class EPropCtrl
    {
        public:
        SetPropPointer( IPropertyHost* pHost);
    };

    Pratiquement si j'ai une classe simple (class Simple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Simple
    {
    protected:
        int iValue;
    };
    dont je veux afficher/modifier les propriétes je fais la chose suivante

    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 SimpleProp : public Simple,
                       public IPropertyHost
    {
    public:
        virtual void     GetProperties( EPropList& PropList )
        {
            PropList.AddPropInt(this,_T("iValue"),&iValue, false);
        }
     
     
     
        IPropertyHost*     GetPropPointer() { return this; }
    protected:
        int iValue;
    };
    Ensuite j'appelle mon controle comme ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EPropCtrl  objPropCtrl; // Objet graphique affichant des propriétes
    SimpleProp simpleProp; //Objet SimpleProp
    objPropCtrl.SetPropPointer( simpleProp.GetPropPointer() );
    //JUSQU ICI TOUT VA BIEN ET CA FONCTIONNE

    //----------------------------------------------------------------
    // maintenant considerons les objets suivants B et A encapsulant
    // l'acces a des structures imbriquees

    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
     
    typedef struct tagStructB
    {
        int        iSizeB;
        char*    szTextB;
    } StructB;
     
    typedef struct tagStructA
    {
        int        iSizeA;
        char*    szTextA;
        StructB sStructB;
    } StructA;
     
     
    class B
    {
    public:
        B(structB& refStructB) { m_refStructB = refStructB ;}
        int        GetSize() {return m_StructB.iSizeB;}
        char*    GetText() {return m_StructB.szTextB;}
     
    protected:
        structB& m_refStructB;
    };
     
     
    class A
    {
    public:
        A();
        int        GetSize() {return m_StructA.iSizeA;}
        char*    GetText() {return m_StructA.szTextA;}
        B&        GetB() { return m_B; }
     
     
    protected:
        structA m_StructA;
        B        m_B;
    };
     
    Use :
     
    A m_a;
    int iSizeA = m_A.GetSize(); // recupere la valeur du champ de ma structure A
    m_A.GetB().GetSize();
    Si je veux afficher les proprietes avec mon controle graphique et en prenant le modèle précédent

    Je vais vouloir faire :

    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
     
    class BProp: public B,
                 public IPropertyHost
    {
        public:
            virtual void     GetProperties( EPropList& PropList ) { PropList.AddPropInt(this,_T("iSizeB"),&m_refStructB.iSizeB, false);
    PropList.AddPropString(this,_T("szTextB"),&m_refStructB.szTextB, false);
     
            IPropertyHost*     GetPropPointer() { return this; }
    };
     
    class AProp: public A,
                 public IPropertyHost
    {
        public:
            virtual void     GetProperties( EPropList& PropList )
            {
     
    PropList.AddPropInt(this,_T("iSizeA"),&m_StructA.iSizea, false);
    PropList.AddPropString(this,_T("szTextA"),&m_StructA.szTextA, false);
     
    ///////////// PROBLEME /////////////////////
                m_B.GetProperties( PropList );
     
      //En effet je ne peux pas appeler GetProperties car appartient a Bprop et non pas a B
     
     
     
            }
     
     
            IPropertyHost*     GetPropPointer() { return this; }
    };
     
     
     
    EPropCtrl  objPropCtrl; // Objet graphique affichant des propriétes
    AProp        objAProp; //Objet AProp
     
    objPropCtrl.SetPropPointer( objAProp.GetPropPointer() );
    /////////////////// PROBLEME : COmment architecture mon soft
    Pour que je puisse afficher les propriétes de mon objet A ainsi que du B a l'interieur ????

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    En faisant hériter Bprop de Aprop et de B...

    bien sûr, ça sous-entend que le losange d'héritage entre Bprop, Aprop, B et A soit virtuel.. sinon, il risque d'y avoir pas mal de bugs
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Ca veut dire que je pourrais faire quoi dans AProp ?

    virtual void GetProperties( EPropList& PropList )
    {
    PropList.AddPropInt(this,_T("iSizeA"),&m__StructA.iSizeA, false);
    PropList.AddPropString(this,_T("szTextA"),&m__StructA.szTextA, false);
    m_B.GetProperties( PropList ); // <----- CANNOT WORK
    }






    Citation Envoyé par Swoög
    En faisant hériter Bprop de Aprop et de B...

    bien sûr, ça sous-entend que le losange d'héritage entre Bprop, Aprop, B et A soit virtuel.. sinon, il risque d'y avoir pas mal de bugs

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    ça ne modifiera pas Aprop par rapport à ce que tu pouvais faire avec ta structure...

    ça modifiera seulement Bprop
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Swoög
    ça ne modifiera pas Aprop par rapport à ce que tu pouvais faire avec ta structure...

    ça modifiera seulement Bprop
    Mon probleme est que justement je ne peux pas avoir acces a BProp en derivant juste mon AProp.

    En fait une solution a mon probleme serait de copier/coller mes classes existantes et de reecrire mon Aprop comme contenant un BProp mais je voulais eviter car ca faisait de la reecriture de code pour rien.

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    OK... j'ai relu ton code, et je viens de comprendre ce que tu veux faire...

    pas évident en effet... il faudrait pouvoir affecter un BProp à Aprop.m_B

    bon, oublie ma suggestion alors...

    voyons... le plus simple, je pense, serait de déclarer dans A, m_B comme étant un B* ou un B& et non un B, comme ça le polymorphisme fonctionnera
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut
    Et en utilisant le Pattern Visitor ???
    Car mes classes A et B sont non modifiables (enfin je prefere pas)

    Citation Envoyé par Swoög
    OK... j'ai relu ton code, et je viens de comprendre ce que tu veux faire...

    pas évident en effet... il faudrait pouvoir affecter un BProp à Aprop.m_B

    bon, oublie ma suggestion alors...

    voyons... le plus simple, je pense, serait de déclarer dans A, m_B comme étant un B* ou un B& et non un B, comme ça le polymorphisme fonctionnera

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Je ne suis pas sûr que le pattern visitor soit utilisable dans ce cas làsi m_B de la classe A est de type B, alors tu ne pourras, de toutes façons, pas lui greffer de GetProperties puisque à l'allocation de m_B, une copie sera faite, et les possibilités de polymorphisme annulées...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Personellement, je reverrais la conception. Je trouve que c'est très compliqué et pas très juste.
    Pour la définition d'une interface IPropertyHost, ok. Retourner la liste des propriétés via un paramètre plutôt que par un type de retour, pourquoi pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class IPropertyHost
    {
    public:
        virtual void GetProperties( EPropList& PropList ) {}
    };
    En revanche ce qui suit me paraît plus que douteux
    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 SimpleProp : public Simple,
                       public IPropertyHost
    {
    public:
        virtual void     GetProperties( EPropList& PropList )
        {
            PropList.AddPropInt(this,_T("iValue"),&iValue, false);
        }
     
     
     
        IPropertyHost*     GetPropPointer() { return this; }
    protected:
        int iValue;
    };
    En terme de conception, en quoi SimpleProp "est un" Simple ?
    Ensuite, SimpleProp::iValue masque la définition de Simple::iValue je suis étonné que le compilateur ne donne pas au minimum un warning.
    Pour finir la fonction GetPropPointer() est une hérésie. Par héritage, une instance de SimpleProp EST UNE instance de IPropertyHost, cette fonction est donc parfaitement inutile.
    Je comprend bien que cela pose des soucis ensuite, mais au lieu d'essayer de traiter les symptômes, je pense que c'est beaucoup plus simple de traiter le mal à sa source.

Discussions similaires

  1. [Concept] Métadatas ?
    Par melinda dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 10/11/2004, 12h56
  2. [Concept] Réplication
    Par melinda dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 31/03/2003, 18h29
  3. [Concept] BD ou Gestion par fichier. Intérêt de la BD ?
    Par Cian dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/11/2002, 13h16
  4. [Concept] Curseur coté client et curseur coté serveur
    Par freud dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 13/09/2002, 23h13
  5. [Concept] Stabilité d'une base de donnée
    Par lassmust dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/07/2002, 17h16

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