C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Pointeur sur fonction membre

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Boris Sargos
Guest





PostPosted: Sat Nov 20, 2004 2:16 am    Post subject: Pointeur sur fonction membre Reply with quote



Salut,

je viens de lire les différents posts sur les pointeurs de fonctions
membres, mais je n'ai pas réussi à obtenir de réponse à mon problème. Il est
le suivant:
Je dispose d'une classe NewtonRootFinder, qui comme son nom l'indique, est
chargée de retourner le zéro d'une fonction, qu'on lui passe en paramètre :
double (*FonctionZero)(double).
Ailleurs dans mon code, j'ai besoin de trouver le zéro d'une fonction :

class MyClass {
double MyClass::FonctionZero(double) { ... } // Fonction dont on
cherche à calculer le zéro
void MyClass::Calcule(void) {
NewtonRootFinder finder;
finder.SetFonction(FonctionZero); // Je passe le
pointeur de fonction en paramètre à mon RootFinder
double resultat = finder.FindZero(); // La fonction
FindZero de l'objet finder calcule le zéro de la fonction membre
MyClass::FonctionZero
}
}

Or cela ne compile pas (et pour cause), puisque finder a besoin d'une
instance de MyClass pour lui appliquer FonctionZero.
Mais je n'ai pas d'autre solution. J'ai aussi regardé les objets fonctions
de la stl (unary_function et mem_func) mais sans résultat, je restez coincé
car NewtonRootFinder doit pouvoir accepter tout type de fonction (membre ou
pas membre) et il n'existe aucune classe qui surclasse unary_function.

Quelqu'un a une solution ?

Merci à tous, et bon week-end.


Back to top
Loïc Joly
Guest





PostPosted: Sat Nov 20, 2004 9:47 am    Post subject: Re: Pointeur sur fonction membre Reply with quote



Boris Sargos wrote:

Quote:
Salut,

je viens de lire les différents posts sur les pointeurs de fonctions
membres, mais je n'ai pas réussi à obtenir de réponse à mon problème. Il est
le suivant:
Je dispose d'une classe NewtonRootFinder, qui comme son nom l'indique, est
chargée de retourner le zéro d'une fonction, qu'on lui passe en paramètre :
double (*FonctionZero)(double).
[...]

Quelqu'un a une solution ?

Ce que j'ai trouvé de plus simple, c'est de dire que le paramètre qu'on
passe à NewtonRootFinder est non pas de type
double(*FonctionZero)(double), mais de type boost::function<double(double)>

Pour ça, il faut pouvoir modifier NewtonRootFinder.

--
Loïc


Back to top
Christophe Lephay
Guest





PostPosted: Sat Nov 20, 2004 10:29 am    Post subject: Re: Pointeur sur fonction membre Reply with quote



Boris Sargos wrote:
Quote:
Je dispose d'une classe NewtonRootFinder, qui comme son nom
l'indique, est chargée de retourner le zéro d'une fonction, qu'on lui
passe en paramètre : double (*FonctionZero)(double).
Ailleurs dans mon code, j'ai besoin de trouver le zéro d'une fonction
:

class MyClass {
double MyClass::FonctionZero(double) { ... } // Fonction dont on
cherche à calculer le zéro
void MyClass::Calcule(void) {
NewtonRootFinder finder;
finder.SetFonction(FonctionZero); // Je passe le
pointeur de fonction en paramètre à mon RootFinder
double resultat = finder.FindZero(); // La
fonction FindZero de l'objet finder calcule le zéro de la fonction
membre MyClass::FonctionZero
}
}

Or cela ne compile pas (et pour cause), puisque finder a besoin d'une
instance de MyClass pour lui appliquer FonctionZero.

Le probème, c'est que sans voir ta classe NewtonRootFinder, c'est un peu dur
de t'aider (ton erreur de compilation a probablement peu à voir avec le fait
d'avoir une instance ou non de MyClass)...

Chris



Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sat Nov 20, 2004 11:30 am    Post subject: Re: Pointeur sur fonction membre Reply with quote

"Boris Sargos" <bsargos (AT) wanadoo (DOT) fr> writes:

Quote:
Quelqu'un a une solution ?

Tu peux faire un objet capable d'encapsuler aussi bien un
pointeur vers fonction et une paire objet, pointeur vers
fonction membre et l'utiliser comme paramètre pour ta
fonction NewtonRootFinder.

Exemple (non vérifié):

class DoubleFunctionBase {
public:
virtual double operator()(double) const = 0;
};

class DoubleFunctionPointer: public DoubleFunctionBase {
public:
DoubleFunctionPointer(double (*fn)(double)) : myFn(fn) {}
double operator()(double d) const { return (*myFn)(d); }
private:
double (*myFn)(double);
};

template <typename T>
class DoubleFunctionMember: public DoubleFunctionBase {
public:
DoubleFunctionMember(T& obj, double (T::*fn)(double))
: myObj(obj), myFn(fn) {}
double operator()(double d) const { return (myObj.*myFn)(d); }
private:
T& myObj;
double (T::*myFn)(double);
};

DoubleFunctionPointer makeFunc(double (*fn)(double))
{
return DoubleFunctionPointer(fn);
}

template <typename T>
DoubleFunctionMember<T> makeFunc(T& obj, double (T::*fn)(double))
{
return DoubleFunctionMember<T>(obj, fn);
}

double NewtonRootFinder(DoubleFunctionBase const& fn) {
return fn(0);
}

double f(double);
class A {
public:
double g(double);
};

int main() {
A a;
NewtonRootFinder(makeFunc(f));
NewtonRootFinder(makeFunc(a, A::g));
}

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Back to top
Boris Sargos
Guest





PostPosted: Sat Nov 20, 2004 1:57 pm    Post subject: Re: Pointeur sur fonction membre Reply with quote

Merci Jean-Marc pour ta réponse.

Peu avant de lire ta réponse, j'avais pensé à cette méthode. C'est efficace.
Mais je me suis rendu compte qu' en fait, cela revient pratiquement à
recréer une partie de l'architecture <functional> de la stl. C'est un peu
dommage, d'autant plus que si j'y vois assez clair, on se prive du coup de
l'utilisation de mem_fun et bind ...
Mais je pense que c'est une solution satisfaisante.
Encore merci.


Back to top
Boris Sargos
Guest





PostPosted: Sat Nov 20, 2004 2:01 pm    Post subject: Re: Pointeur sur fonction membre Reply with quote

Ok, c'est toujours difficile de résumer son code par mail. En fait, ma
classe NewtonRootFinder n'a que deux fonctions :
- SetFunction : stocke la fonction à analyser
- FindZero : moteur de calcul pour trouver le zéro de la fonction
membre.
Puis elle a un membre : m_function qui est la fonction à analyser (fonction
réelle à valeurs réelles) . C'est tout (j'ai omis les détails techniques du
genre intervalle de calcul, précision, etc ...).
Merci.


Back to top
Boris Sargos
Guest





PostPosted: Sat Nov 20, 2004 2:01 pm    Post subject: Re: Pointeur sur fonction membre Reply with quote

Ok, mais c'est quoi boost ?

Merci.


Back to top
Loïc Joly
Guest





PostPosted: Sat Nov 20, 2004 5:41 pm    Post subject: Re: Pointeur sur fonction membre Reply with quote

Boris Sargos wrote:
Quote:
Ok, mais c'est quoi boost ?

www.boost.org

--
Loïc

Back to top
Boris Sargos
Guest





PostPosted: Sat Nov 20, 2004 6:35 pm    Post subject: Re: Pointeur sur fonction membre Reply with quote

Ok merci.


Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.