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 sur fonctions en C++ vers des methodes d'une classe


Sujet :

C++

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut Pointeur sur fonctions en C++ vers des methodes d'une classe
    Bonjour a tous,

    apres avoir longuement cherche sur le net une methode pour faire un tableau de pointeurs sur fonction (a la maniere C) mais en C++.

    les seules reponses qui ressortent sont qu'il faut faire une fonction static ( voir la reponse a ce lien http://c.developpez.com/faq/cpp/?pag...nction_membre).

    cela me pose probleme car j'ai absolument besoin de membres de ma classe qui sont en private dans ma la-dite fonction (celle la meme qui devrait se retrouver en static).

    existe-t il une maniere officielle de faire ce genre d'architecture (tableau de pointeur sur fonction sur methodes d'une classe) ou bien y a t il une maniere plus C++'style d'effectuer cela ?

    merci d'avance a ceux qui prendront le temps de considerer ce probleme.

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    tu peux tout à fait faire un pointeur de fonction membre, le type associé est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Rtype (Classe::*)(Params)
    exemple pour une fonction membre de la classe A, prenant une référence constante de string et un int en paramètres et retournant un booléen :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool (A::*)(const string&, int)
    ensuite, pour l'appeller, il te faut une instance de la classe et le pointeur s'appelle avec .* ou ->* (dans le cas d'un pointeur)

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void func(A& a, bool (A::a_func)(const string&, int), const string& str, int i)
    {
        a.*a_func(str, i);
    }
     
    // ou 
     
    void func(A* a, bool (A::a_func)(const string&, int), const string& str, int i)
    {
        a->*a_func(str, i);
    }
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Merci pour ta reponse.

    Soit il y a qq chose que je n'ai pas compris, soit qq chose que je fait mal.

    voila au final ce que j'aimerais faire

    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
     
    class my_class
    {
       /*.....*/
     public:
      void my_function(std::string &str);
    };
     
    struct my_struct
    {
      int   id;
       void (my_class::*f)(std::string &);
    };
     
    my_struct    my_array[] =
    {
      {id, /*le pointeur sur fonction*/},
      {id2, /*le pointeur sur fonction*/},
      {id3, /*le pointeur sur fonction*/},
      /* .....  */
    };
    mais ce code ne compile pas.

    ou est le probleme? qu'est ce que je fais de mal?

    merci d'avance

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    le code ne compile pas...
    tu peux donner le message d'erreur s'il te plait ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    alors j'ai reussi tant bien que mal a faire compiler mon tableau de pointeurs sur fonctions

    maintenant lorsque j'essai d'utiliser un de mes pointeurs ca ne marche pas, et je ne comprends pas l'erreur qu'il me met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      void		(ma_classe::*ptr)(std::string &);
     
      ptr = fct_array[id].f;
     
      server.*ptr(str);
    et l'erreur qu'il me met:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    main.cpp: In function `int main(int, char**)':
    main.cpp:43: error: must use .* or ->* to call pointer-to-member function in `
       ptr (...)'
    make: *** [main.o] Error 1

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    server.(fct_array[id].*f(str));
    ca marche ca ?

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    main.cpp:42: error: parse error before `fct_array'
    main.cpp:42: error: `f' undeclared (first use this function)
    j'avoue ne pas y comprendre grand chose la.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    Citation Envoyé par samball
    Bonjour a tous,

    apres avoir longuement cherche sur le net une methode pour faire un tableau de pointeurs sur fonction (a la maniere C) mais en C++.

    les seules reponses qui ressortent sont qu'il faut faire une fonction static ( voir la reponse a ce lien http://c.developpez.com/faq/cpp/?pag...onction_membre).

    cela me pose probleme car j'ai absolument besoin de membres de ma classe qui sont en private dans ma la-dite fonction (celle la meme qui devrait se retrouver en static).

    existe-t il une maniere officielle de faire ce genre d'architecture (tableau de pointeur sur fonction sur methodes d'une classe) ou bien y a t il une maniere plus C++'style d'effectuer cela ?

    merci d'avance a ceux qui prendront le temps de considerer ce probleme.
    c'etait entre autre ce post qui m'avait ammene a venir poster ma question.

    apres, peut etre que j'ai loupe qq chose dans cette FAQ, et dans ce cas je te serais reconnaissant de m'eclairer.

    merci

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2006
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    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
     
    #include <string>
    #include <iostream>
     
    class my_class
    {
     
     public:
      void my_function(int a);
    };
     
    void my_class::my_function(int a) {
    	std::cout << a << std::endl;
    }
     
     
    struct my_struct
    {
      int   id;
      void (my_class::*f)(int);
    };
     
     
    void my_test ( void (my_class::*my_function)(int) ) {
     
    	my_class obj;
    	(obj.*my_function)(5);
    }
     
    my_struct    my_array[] = { 
    				{5,&my_class::my_function}
                              };
     
    int main() {
     
    my_test(&my_class::my_function);
     
    my_class obj;
    (obj.*my_array[0].f)(12);
     
    return 0;
    }
    Pas évident la syntaxe

  11. #11
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Tu as regardé du côté de std::mem_fun ?

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 78
    Points : 41
    Points
    41
    Par défaut
    effectivement la syntaxe du dernier appel est un peu rock&roll :-)

    mais l'essentiel c'est que ca marche et que ce sera autrement plus beau qu'une serie de if else if ou un gros switch case.

    ceci dit, une question reste en suspend:

    est ce que cette methode est consideree comme etant "C++ propre" ?
    ou existe-t il une autre maniere d'architecturer un protocol dans le cas qui me concerne (sachant que le tableau de pointeur est la pour repartir les packets dans les bonnes methodes de ma classe) ?

    en tout cas un grand merci a vous

  13. #13
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    pourquoi tu fais pas plutôt
    std::map<int, boost::function<void (int)> >

    Dans un boost::function tu peux stocker un pointeur vers une fonction membre ainsi que l'objet à utiliser.
    Et l'appel à la fonction est très simple.
    Boost ftw

Discussions similaires

  1. Réponses: 5
    Dernier message: 15/03/2012, 00h26
  2. [JOGL] - equivalent des pointeurs sur fonction
    Par sir_gcc dans le forum OpenGL
    Réponses: 2
    Dernier message: 12/01/2009, 20h26
  3. Réponses: 8
    Dernier message: 20/01/2008, 12h09
  4. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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