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 :

typedef avec fonction membre


Sujet :

C++

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut typedef avec fonction membre
    Bonjour!
    Je ne comprends pas pourquoi cet exemple ne marche pas. Comment devrais-je faire cela selon vous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A
    {
    public:
      void f(){}
    };
     
    int main(int argc,char* argv[],char* envp[])
    {
      typedef void (A::*FCT)();
      FCT fct = A::f;
      fct();
    }
    Erreur de compilation à la ligne fct():
    error C2064: le terme ne correspond pas à une fonction qui prend les arguments 0

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut Re: typedef avec fonction membre
    pour compléter la reponse de JolyLoic j'ajouterai qu'il faut déclarer (ou créer) une instance car la fonction f ne peut être appelée si ce n'est par une instance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc,char* argv[],char* envp[]) 
    { 
      typedef void (A::*FCT)(); 
      A a;
      FCT fct = &A::f; 
      (&a->*fct)(); 
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Oui pardon, l'appel deveit être fait depuis une fonction membre. Mais mettre un '&' ne résoud pas mon problème, je crois que ca ne change rien (il est implicite): le code suivant génère la même erreur.
    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 A
    {
    public:
      void f(){}
      void g()
      {
        typedef void (A::*FCT)();
        FCT fct = &A::f;
        fct();
      }
    };
     
    int main()
    {
    }
    Petite précision: j'ai besoin si possble que g soit non statique

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    pour le & tu as raison.

    en fait le problème se trouve dans la façon dont tu appelles la fonction membre. Je pense que tu n'as pas bien lu mon post. il faut appeler f dans le contexte d'une instatnce de la classe car c'est une fonction memebre non static. ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int main(int argc,char* argv[],char* envp[]) 
    { 
      typedef void (A::*FCT)(); 
      A a; 
      FCT fct = A::f; 
      (&a->*fct)(); 
    }

  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Excuse moi c'est moi qui n'est pas lu ton post. je crois que la solution à ton problème c'est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void g() 
      { 
        typedef void (A::*FCT)(); 
        FCT fct = &A::f; 
        (this->*fct)(); 
      }

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Oui ca marche! J'avais essayé, mais sans mettre le this. Tu comprends pourquoi (*fct)() ne marche pas? Merci en tous cas, cas sans ca j'étais obligé de le faire en assmbleur et c'était pas très joli

  8. #8
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par socrate
    Oui ca marche! J'avais essayé, mais sans mettre le this. Tu comprends pourquoi (*fct)() ne marche pas? Merci en tous cas, cas sans ca j'étais obligé de le faire en assmbleur et c'était pas très joli
    Je vais tenter d'expliquer pourquoi (*fct)() ne marche pas. fct telle que déclarée (typedef void (A::*FCT)(); FCT fct peut adresser n'importe quelle fonction de prototype 'void fonction()' de n'importe quelle instance de A; Il est donc nécessaire de préciser l'intance dont la fonction 'f' sera addressé par 'fct' d'où la nécessité de mettre '(this->*fct)()' (cela permet par exemple de faire la différencier si on avait créer une intance a de la classe A).
    J'espère t'avoir aidé à comprendre dans cette tentative d'explication.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    Oui je suis d'accord, mais normalement dans les méthodes d'une classe, le this-> est implicite.
    Ainsi quand on fait m() ca veut dire this->m(), et a->m() fait l'appel pour a, et il n'y a jamais d'ambigüité

  10. #10
    Nouveau membre du Club
    Inscrit en
    Août 2004
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 35
    Points : 38
    Points
    38
    Par défaut
    this n'est implicite que pour les données ou méthodes membres!
    Etant donné que fct qui est une variable locale, n'est pas membre de la classe A c'est tout à fait normal de préciser explicitement l'instance avec this en l'occurence.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 62
    Points : 48
    Points
    48
    Par défaut
    D'accord, je crois que j'ai compris. Merci

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Effectivement, pour l'appel, j'avais loupé qu'il manquait un objet auquel appliquer la fonction. Par contre, pour le &, j'insiste. Il n'est implicite que pour les fonctions libres, pas pour les fonctions membres.

    Je crois que c'est dans le D&E que Bjarne Stoustrup indique que s'il avait eu le choix, il l'aurait aussi rendu explicite pour les fonctions libres.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

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

Discussions similaires

  1. Boost thread avec fonction membre non statique.
    Par Klaim dans le forum Boost
    Réponses: 2
    Dernier message: 11/08/2007, 02h58
  2. accumlate avec une fonction membre
    Par yan dans le forum SL & STL
    Réponses: 2
    Dernier message: 07/08/2007, 12h09
  3. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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