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 :

[Heritage de classes] - acceder à une fonction


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut [Heritage de classes] - acceder à une fonction
    Bonjour,

    Voila, j'ai deux classes :
    - cObjet : mon objet
    - iEcouteurEvenement : un ecouteur d'evenements (par ex : la souris)

    Lorsque je construit un nouvel objet qui doit ecouter les evenements, par exemple un bouton, je construit une nouvelle classe :

    cBouton, qui hérite de cObjet et de iEcouteurEvenement

    Mon probleme :

    Dans cObjet, j'ai une variable booléene : estEcouteurEvenement qui vaut false par défaut.

    Lorsque je crée un cBouton, je voudrais que estEcouteurEvenement soit égal à true de façon automatique.

    Alors j'ai pensé à ça : dans le constructeur de iEcouteurEvenement, mettre estEcouteurEvenement à true.

    Sauf que estEcouteurEvenement est membre de cObjet.

    Vu que cBouton hérite des deux (cObjet et iEcouteurEvenement) doit bien y avoir un moyen de mettre estEcouteurEvenement à true dans la construction de iEcouteurEvenement ?

    (je pourrais toujours le faire dans le constructeur de cBouton, mais je perd mon automatisme)

    Merci !

  2. #2
    Membre Expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Par défaut
    euh tu as essayé ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cObjet::estEcouteurEvenement = true;
    mais je doute de la validité de ta conception .... :s

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    A mon avis ta conception mériterait d'être revue, je doute qu'il soit nécessaire de faire ce que tu fais.

    Pourquoi souhaites-tu garder un booléen indiquant si l'objet dérive de iEcouteurEvenement ?

  4. #4
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ah, effectivement, je n'ai pas essayé...

    Je doute aussi de la validité de ma conception, mais c'est en phase de tests... pour valider, justement !

    En fait, pour l'instant j'ai ça, qui est validé :

    - Je crée un objet (bouton = new cBouton)
    - j'ajoute cet objet dans un conteneur (conteneur->ajouteObjet(bouton))

    Mais je voudrais que si mon objet (ici cBouton) implémente iEcouteurEvenement, alors lorsque je fait conteneur->ajouteObjet, le conteneur ajoute l'objet non seulement dans sa liste "d'enfants", mais aussi dans sa liste d'ecouteurs, de facon automatique.

    Donc j'ai pensé mettre un booléen ::estEcouteurEvenement dans chaque objet, qui indique si il doit etre ajouté à la liste d'ecouteurs ou non, et que ce booléen soit mis à true lors de la construction de iEcouteurEvenement.

    Comme ça :
    - un objet qui ne l'implemente pas a ce booléen à false est n'est pas ajouté à la liste d'ecouteurs
    - un objet qui l'implemente, lors de sa construction, le booleéen est mis à true, et lors de l'ajout au parent, il est aussi ajouté à la liste d'ecouteurs

    Evidemmenent, si il y a mieux, je suis prenneur !

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Si tu compiles avec le mode RTTI (runtime type information) de ton compilateur, il suffit de 'caster' le cObject en iEcouteurEvenement . Si le résultat est null, alors le cObject implémente pas, sinon, il implémente.

    Si tu compiles sans RTTI... alors:
    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 cObject
    {
       ...
     
       virtual iEcouteurEvement*   getEcouteur(void) const
       { return 0; }
     
    };
     
     
     
    class cButton : public cObject, iEcouteurEvenement
    {
        ....
     
       virtual iEcouteurEvement*   getEcouteur(void) const
       { return (iEcouteurEvenement*)this; }
    }
     
     
     
     
    conteneur::ajouteObject(const cObject* pObj)
    {
         .....
         iEcouteurEvenement* pEcouteur = pObj->getEcouteur();
         if (pEcouteur)
             ajouteEcouteur(pEcouteur);
    }
    Bon, je me suis certainement mélangé les pinceaux entre anglais et français (c'est dingue le mal que j'ai à mettre du français dans du code !)

    Mais on est obligé de demander l'interface iEcouteurEvenement à l'objet, parceque l'addresse mémoire de l'interface (celle de la table virtuelle de l'interface) ne correspond pas à l'addresse mémoire de l'objet (celle de la table virtuelle de l'objet). Donc un simple cast (iEcouteurEvenement*) ne fonctionne pas.

  6. #6
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Je connaissait pas le RTTI...

    Et sinon, sans RTTI, effectivement, c'est pas con comme methode !

    Merci !

    Euh... au passage, tu pourrait me donner plus d'infos sur le RTTI ?
    Ou c'est que ça se regle comme option ?
    En terme de performances, je suppose que c'est un peu gourmand, non ?

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Pas besoin de créer une fonction virtuelle pour vérifier le type réel d'un objet, le RTTI permet justement de le faire directement via dynamic_cast (voir FAQ)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    conteneur::ajouteObject(const cObject* pObj)
    {
         .....
         iEcouteurEvenement* pEcouteur = dynamic_cast<iEcouteurEvenement*>(pObj);
         if (pEcouteur)
             ajouteEcouteur(pEcouteur);
    }
    Mais bon, je pense que ton design pourrait être amélioré pour éviter ce genre de "bidouille".

    PS : le cast (iEcouteurEvenement*)this est fortement déconseillé dans ce contexte, dans certaines circonstances il ne renverra pas ce que l'on attend

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  2. [.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
  3. [AS2] Atteindre attribut d'une classe depuis une fonction interne a la classe
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/04/2006, 21h03
  4. [class] Ajouter class devant une fonction
    Par Pedro dans le forum Langage
    Réponses: 12
    Dernier message: 07/03/2005, 13h11
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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