thoflo1
Messages postés1Date d'inscriptionvendredi 1 avril 2011StatutMembreDernière intervention 1 avril 2011
-
1 avril 2011 à 08:45
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 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 ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question