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 membre


Sujet :

C++

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut pointeur de fonction membre
    Bonjour, j'ai un souci sur mes pointeurs de fonction membre. Voici mon code en simplifié :

    fichier : MaClasse.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
    18
    19
    20
     
    class MaClasse;
     
    typedef bool (MaClasse::*evalGradF)(int x1,int x2,int x3,int x4);
     
    class MaClasse
    {
    public :
     
      MaClasse(int x);
      ~MaClasse() {}
     
      bool f1(int x1,int x2,int x3,int x4);
      bool f2(int x1,int x2,int x3,int x4);
      bool f(int x1,int x2,int x3,int x4);
     
     
    private :
       evalGradF _evalGradF;
    };
    fichier MaClasse.cpp

    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
     
    MaClasse::MaClasse(int x)
    {
      _evalGradF = (x < 2) ? &MaClasse::f1 : &MaClasse::f2;
    }
     
    bool MaClasse::f(int x1,int x2,int x3,int x4)
    {
      return _evalGradF(x1,x2,x3,x4);
    }
     
    bool MaClasse::f1(int x1,int x2,int x3,int x4)
    {
      return ( (x1 < 1) && (x2 < 2) && (x3 < 3) && (x4 < 4) );
    }
     
    bool MaClasse::f2(int x1,int x2,int x3,int x4)
    {
      return ( (x1 < 1) || (x2 < 2) || (x3 < 3) || (x4 < 4) );
    }
    et là, au niveau de la fonction f(), j'ai l'erreur à la compilation :

    error C2064: term does not evaluate to a function taking 4 arguments
    Avez-vous une idée ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    J'ai trouvé une solution qui compile (je n'ai pas encore testé l'exécution) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool MaClasse::f(int x1,int x2,int x3,int x4)
    {
      return (this->*_evalGradF)(x1,x2,x3,x4);
    }
    Mais je ne comprends pas pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool MaClasse::f(int x1,int x2,int x3,int x4)
    {
      return (*_evalGradF)(x1,x2,x3,x4);
    }
    ne marche pas...

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    c'est normal que ça ne fonctionne pas : il faut se mettre à la place du compilateur. Quand tu appelles une méthode, d'un point de vue compilation, c'est comme appeler une fonction libre en lui passant un paramètre supplémentaire qui est l'adresse de objet. En revanche, l'appel à une VRAIE fonction libre (ou méthode statique) ne nécessite pas cette opération.

    Au moment ou tu veux compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (*_evalGradF)(x1,x2,x3,x4);
    Le compilo ne peut pas savoir si _evalGradF pointe vers une fonction libre ou vers une méthode de l'objet. Il ne sait donc pas quelles opérations choisir. En revanche, avec le this, tu lui donnes cette information, donc c'est ok.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    ok !

    merci

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Au moment ou tu veux compiler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return (*_evalGradF)(x1,x2,x3,x4);
    Le compilo ne peut pas savoir si _evalGradF pointe vers une fonction libre ou vers une méthode de l'objet.
    Si. _evalGradF a pour type "pointeur sur fonction membre de MaClasse prenant 4 arguments entiers et retournant un bool, il ne peut pas contenir un pointeur vers une fonction libre.

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Si. _evalGradF a pour type "pointeur sur fonction membre de MaClasse prenant 4 arguments entiers et retournant un bool, il ne peut pas contenir un pointeur vers une fonction libre.
    Bien vu. Et un pointeur vers une méthode statique ? Est ce que le typage d'un pointeur de fonction gère ceci ?

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Mais je ne comprends pas pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool MaClasse::f(int x1,int x2,int x3,int x4)
    {
      return (*_evalGradF)(x1,x2,x3,x4);
    }
    ne marche pas...
    Parce que * unaire prend un argument qui est un pointeur sur un objet ou un pointeur sur une fonction et pas un pointeur sur une fonction membre. Je ne vois pas de raisons fondamentales qui empecheraient de faire ce que tu desires, mais le langage ne l'a jamais permis.

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

Discussions similaires

  1. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  2. Pointeur de fonction membre.
    Par fabone dans le forum C++
    Réponses: 2
    Dernier message: 18/01/2006, 13h18
  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