Pointeur vers des fonctions membres d'une classe

thoflo1 Messages postés 1 Date d'inscription vendredi 1 avril 2011 Statut Membre Dernière intervention 1 avril 2011 - 1 avril 2011 à 08:45
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 1 avril 2011 à 10:35
Bonjour,
J'utilise une méthode d'une classe issue d'une librairie c++, qui prend un pointeur vers une fonction en argument :
typedef void (*fptr)(Type1&, Type2&);
Class A
{
  void methode1(fptr toto);
  ...
}

sachant que methode 1 stocke le pointeur fptr dans un vecteur, et l'utilise plus tard dans plusieurs autres méthodes.

Je souhaite générer une famille de fonctions dans une boucle:
f(Type1& var1, Type2&var2, int i), j'ai donc créé une classe

class B
{
   int param;
   void f_B(Type1& var1, Type2& var2);
}
int main
{
A A1;
for(int i=1;i<N;i++){
  void (B::*fBPtr)(Type1&, Type2&);
  fBPtr = &B::f_B;
  B B1(i);
  A1.methode1((B1.*fBPtr)); 
}


J'obtiens l'erreur suivante :
error: invalid use of non-static member function

Quelqu'un peut-il m'aider ou me proposer une autre méthode pour parvenir à mes fins ?
A voir également:

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
1 avril 2011 à 10:35
librairie => bibliothèque, merci.

Malheureusement, un pointeur sur fonction et un pointeur sur fonction membre ont des types différents, et ne sont donc pas compatible.
Tu peux forcer un pointeur sur membre à "rentrer" dans un pointeur sur fonction, via "reinterpret_cast<fptr>(B1.*fBPtr)", mais tu auras un résultat erroné.

Tu peux tenter d'utiliser des membres statiques, qui sont au final de simple fonction.
Si tu peux modifier la bibliothèque, alors utilise du boost::bind + boost::function, qui remplace très avantageusement tous les pointeurs sur fonctions/membres.
#include 

typedef int Type1;
typedef int Type2;

class B;
typedef void (*fptr)(Type1&, Type2&);
typedef void (B::*fBPtr)(Type1&, Type2&);

class A
{
 public:
  void methode1(fptr toto)
  {
    Type1 a = 5;
    Type2 b = 10;
    toto(a, b);
  }
};

class B
{
public:
  B(int param)
  {
    param_ = param;
    std::cout << param_ << std::endl;
  }
  static void f_B(Type1& var1, Type2& var2)
  {
    std::cout << "var1 " << var1 << ", var2 " << var2
      << ", param = " << param_ << std::endl;
  }
private:
  static int param_;
};

int B::param_ = 0;

int main()
{
  A A1;
  for(int i = 0; i < 10; ++i)
  {
    B B1(i);
    A1.methode1(&B::f_B);
  }

  return 0;
}


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous