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 :

Utilisation d'une fonction d'une fonction membre d'une classe


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Utilisation d'une fonction d'une fonction membre d'une classe
    Bonjour,

    J'aimerais utiliser une fonction ayant comme argument une fonction membre d'une classe.
    Vous pouvez trouver un exemple tres simple de ce que je veux faire a la fin du message.
    J'arrive a faire fonctionner mon code si je passe comme argument de fonction, une fonction non-membre de ma classe.
    Je pense que je dois rater quelque chose et je serais tres heureux si quelqu'un pouvait m'aider.

    Merci

    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
    #include <iostream>
     
    class SimpleClass {
      float x0_;
      public :
       SimpleClass();
       virtual ~SimpleClass(){};
       float f(float x){return x+x0_;};
       float F(float (*func)(float), float a, float b);
    };
     
    float g(float x){return x+1;};
     
    SimpleClass::SimpleClass() : x0_(1) {
      float (*func) (float);
      //func = f;// ne compile pas
      func = g; // compile et fonctionne correctement
      std::cout<<F(func,2,4)<<"\n";
    }
     
    float SimpleClass::F(float (*func)(float), float a, float b){
      return (*func)(a)+(*func)(b);
    }
     
    int main (){
     SimpleClass ab;
     return 0;
    }

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les fonctions membres et les fonctions libres (ou statiques) ont des types différents, tu ne peux pas les mélanger.

    Fonction libre :
    float (*func)(float)

    La même en fonction membre de SimpleClasse :
    float (SimpleClasse::*func)(float)

    Ce qui est plutôt logique, puisque pour appeler une fonction membre il faut une instance de la classe...

    Tu peux enrober tout ça dans une structure homogène, par exemple en utilisant boost::function et boost::bind.

  3. #3
    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
    Salut !



    Alors, le problème est qu'en C++, les fonctions non-membres et les fonctions membres ne sont pas considérées comme des types équivalents...

    voilà une surdéfinition de SimpleClass::F qui te permettra de voir comment demander et appeler un pointeur de fonction membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float SimpleClass::F(float (SimpleClass::*func)(float), float a, float b){
      return (this->*func)(a)+(this->*func)(b);
    }
    Si tu as d'autres questions, n'hésite pas
    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)

  4. #4
    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
    Trop tard, Swöög a répondu

    Regarde du côté de boost::bind pour Boost et std::mem_fun pou la STL, les 2 solutions marchent pour toi à priori

Discussions similaires

  1. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  2. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  3. utilisation de fonction membre dans une autre
    Par tcharles dans le forum C++
    Réponses: 4
    Dernier message: 14/12/2005, 17h19
  4. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  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