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

Langage C++ Discussion :

Utilisation des pointeurs de fonctions membres


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Utilisation des pointeurs de fonctions membres
    Bonjour à tous,

    J'inaugure ici mon premier post, alors n'hésitez pas à me signaler toute erreur d'utilisation ...

    J'ai donc un souci avec des pointeurs de fonctions membres en C++.
    Je pense que c'est plus un problème syntaxique mais je vous laisse juger :

    J'ai bien sûr simplifier le code
    Pour info (si c'est utile) je suis sous Eclipse.


    Voici mon .h :

    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
     
    class maClasse;
     
    typedef unsigned char (maClasse::*AffMemberFn)();
    #define CallMemberFn(object, ptrToMember) ((object).*(ptrToMember))
     
    class maClasse{
       private:
       [...]
       void Gestion0();
       unsigned char Gestion1();
       unsigned char Gestion2();
       unsigned char Gestion3();
       void MaFonction(int i, AffMemberFn pfm1, AffMemberFn pfm2, AffMemberFn pfm3);
       public:
       [...]
    }
    et mon .c :

    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    void maClasse::Gestion0(){
       AffMemberFn mpfm1 = NULL;
       AffMemberFn mpfm2 = NULL;
       AffMemberFn mpfm3 = NULL;
       short param1 = 0;
     
       if(GSM::ServerOK){
          if(this->aboOk){
             mpfm1 = &maClasse::Gestion1;
             mpfm2 = NULL;
             mpfm3 = &maClasse::Gestion3;
             param1 = 1;
          }
          else{
             mpfm1 = &maClasse::Gestion1;
             mpfm2 = &maClasse::Gestion2;
             mpfm3 = NULL;
             param1 = 2;
          }
       }
       else{
          mpfm1 = &maClasse::Gestion1;
          mpfm2 = NULL;
          mpfm3 = NULL;
          param1 = 3;
       }
       this->maFonction(param1, mpfm1, mpfm2, mpfm3);
    }
     
    unsigned char maClasse::Gestion1(){
    }
     
    unsigned char maClasse::Gestion2(){
    }
     
    unsigned char maClasse::Gestion3(){
    }
     
    void maClasse::MaFonction(int i, AffMemberFn pfm1, AffMemberFn pfm2, AffMemberFn pfm3){
     
       unsigned char result = 0;
       int a = Config::instance->Get(i);
     
       switch(a){
          case 0:{
             result = pfm1();
          }
          break;
          case 1 :{
             result = pfm2();
          }
          break;
          case 2 :{
             result = pfm3();
          }
          break;
          default :
          break;
       }
     
       this->AffichePage(result);
    }
    L'erreur que j'ai se situe dans "MaFonction" au niveau de l'appel des pointeurs (result = pfm1()) : must use '.*' or '->*' to call pointer-to-member function in pfm1(...)

    Voilà
    J'espère que c'est pas trop incompréhensible.

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    C'est un pointeur sur méthode membre de la classe Affichage.
    Il vous faut donc une instance d'objet "Affichage" pour appeler ces méthodes.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Ah mince. J'ai laissé trainer cet "Affichage".

    "Affichage" est en fait "MaClasse".

    Je travaille intégralement à l'intérieur de cette classe (est-ce la raison du problème ?). Une méthode membre (maFonction) prend en paramètres des pointeurs (mpfm1, mpfm2 et mpfm3)sur autres méthodes membres de la même classe MaClasse.

    Je vais essayer de corriger mon post, sinon je posterai une correction.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Changement effectué dans le post initial

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Ne confondez pas classes et objets (ou instance de la classe).
    Il vous faut donc une instance de maClasse. "this" est une instance de maClasse.
    La méthode MaFonction connait "this", mais vous devez indiquez sur quelle instance de maClasse vous appelez pfm1 même si c'est "this".
    Cela pourrait être n'import quelle autre instance de maClasse et vous pouvez "appeler" ces pointeurs à l'extérieur d'une instance de maClasse.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    D'accord. Je devrais donc préciser l'objet de cette manière : this->*pfm1() (exact ?) l'étoile étant là pour préciser qu'il s'agit d'un pointeur sur une méthode.

    Or l'erreur reste la même.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Ce code compile :
    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
    switch(a){
          case 0:{
             result = (this->*pfm1)();
          }
          break;
          case 1 :{
             result = (this->*pfm2)();
          }
          break;
          case 2 :{
             result = (this->*pfm3)();
          }
          break;
          default :
          break;
       }
    Fallait pas chercher bien loin.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Ah !! Super !! Merci beaucoup !!!

    En effet, il ne fallait pas chercher bien loin
    C'est une syntaxe que je n'avais pas essayée ...

    Merci merci !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'en ai fini avec les tests et cela marche bien.
    Je ne suis pas sûr que les perfs soient au top mais ça fait ce que je veux et me facilite bien la vie.

    Merci beaucoup Bacelar !!!

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

Discussions similaires

  1. Utilisation d'un pointeur de fonction membre
    Par ram-0000 dans le forum C++
    Réponses: 4
    Dernier message: 25/03/2014, 07h37
  2. [Language]Equivalent Java des pointeurs de fonctions du C/C++
    Par Thierry Chappuis dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 15h14
  3. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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