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 :

pointeur de fonction et heritage


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut pointeur de fonction et heritage
    Bonsoir

    Supposons :
    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
    class Module
    {
    protected:
        typedef bool (Module::*TMessageFct)(const Message& rcMessage);
     
    private:
        typedef std::map<int, TMessageFct> TMapMessageFct;
        TMapMessageFct m_mapMessages;
     
    public:
        Module() { }
        virtual ~Module() {}
     
        void Connect(int nMsg, TMessageFct pFonction)
        {
            m_mapMessages[nMsg] = pFonction;
        }
    };
    et :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MonModule : public Module
    {
    public:
        MonModule()
        {
            Connect(1, &MonModule::OnMessage1);
        }
     
        void OnMessage1(const Message& rcMessage)
        {
        }
    };
    Mon compilateur rale sur le connect, car il trouve que la signature n'est pas bonne. Je peux comprendre, Module::Fonction est différent de MonModule::UnAutreFonction.

    Y a t il une methode pour s'en sortir ? Un vieux caste de la mort est il propre ?
    En fait, je pensais que comme il y avait héritage, ca pouvait passer...
    --
    Jérémie

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Bonjour

    il faut appeler la fonction dans la classe mère:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Module::Connect(1, &MonModule::OnMessage1);
    bonne chance

  3. #3
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Je doute que le compilo puisse convertir un "Module::Fonction" en "MonModule::UnAutreFonction", même avec l'héritage. (enfin je n'ai jamais essayé)

    Pour ce genre de chose j'utilise boost::signals

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Pour l'héritage de pointeur de fonction membre, si un simple static_cast<> marche, c'est "safe".
    S'il faut autre chose qu'un static_cast<> pour que ça rentre, c'est que tu cherches à faire un truc incorrect (typiquement dans des cas d'héritage multiple).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Un static_cast ne semble pas marcher.
    Ca me fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: invalid static_cast from type 'void (MonModule::*)(const std::Message&)' to type 'bool (Module::*)(const std::Message&)'
    Je propose une solution:
    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
    class Module
    {
    protected:
      typedef bool (*TMessageFct)(const Message& rcMessage);
      //plus de Module:: ici
    
    private:
      typedef std::map<int, TMessageFct> TMapMessageFct;
      TMapMessageFct m_mapMessages;
    
    public:
      Module() { }
      virtual ~Module() {}
    
      void Connect(int nMsg, TMessageFct pFonction)
      {
        m_mapMessages[nMsg] = pFonction;
      }
    };
    
    class MonModule : public Module
    {
    public:
      MonModule()
      {
        Connect(1,(TMessageFct)&bind(&MonModule::OnMessage1, this, _1));
      }
    
      void OnMessage1(const Message& rcMessage)
      {
      }
    };
    bind se trouve dans boost::bind

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Le type de retour de la fonction est mauvais: Elle doit retourner un bool
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Woups!!
    Autant pour moi!
    j'avais pas vu

    En effet, en corrigeant ça, avec un static_cast, ça compile

    EDIT: et ça fonctionne

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 153
    Par défaut
    Merci pour vos point de vue.
    Apres une bonne nuit de sommeil, j'ai pensé à qqchose du genre :

    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
    template <class T>
    class Module
    {
    protected:
        typedef void (T::*TMessageFct)(const Message& rcMessage);
     
    private:
        typedef std::map<int, TMessageFct> TMapMessageFct;
        TMapMessageFct m_mapMessages;
     
    public:
        Module() { }
        virtual ~Module() {}
     
        void Connect(int nMsg, TMessageFct pFonction)
        {
            m_mapMessages[nMsg] = pFonction;
        }
    };
    et donc une implementation possible par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class MonModule : public Module<MonModule>
    {
    public:
        MonModule()
        {
            Connect(1, &MonModule::OnMessage1);
        }
     
        void OnMessage1(const Message& rcMessage)
        {
        }
    };
    Pas testé car pas de compilateur sous la main, mais je regarde ça ce soir.
    --
    Jérémie

  9. #9
    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
    Par défaut
    Ca compile, ca marche, c'est formidable.

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

Discussions similaires

  1. opengl et pointeur de fonction
    Par Oldhar dans le forum C
    Réponses: 5
    Dernier message: 06/11/2003, 23h56
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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