OVH Cloud OVH Cloud

Methode prenant une methode en parametre ?

3 réponses
Avatar
chahnaz.ouzikene
Bonjour,

Evitons les blahblah : J'ai besion de créer une classe modélisant une
application OpenGL. Pour ce, j'ai besoin d'écrire une méthode qui prends une
méthode en paramètre, j'ai besoin de votre aide pour y parvenir car je ne
sais pas quelle syntaxe utiliser.

<code>
class ParameterNeeded{

public :

ParamaterNeede();

setNeededMethode(void *(*) () ); // comment declare un parametre de type
pointeur vers fonction ??

private :

void * (*) privateMethode; // pointeur vers une methode ??

};

ParameterNeeded::ParametreNeeded(){

cout << "Constructeur de la classe qui demande un parametre de type
methode\n";

}

void ParameterNeeded::setNeededMethode(void * f()){ // est-ce correct ?

privateMethode=f;

cout << "J'ai trouve la fonction dont j'ai besoin !\n";

}

class ParameterProvider {

ParameterProvider();

ProvidedMethode();

};

/* Implementation de la classe ParameterProvider*/

...

...

...

/* Implementation de la classe ParameterProvider*/

main(){

ParameterNeeded Pn = new ParameterNeeded();

Pn->setNeededMethode(&ParametreProvider::ProvidedMethode) // adresse d'une
fonction/methode ?

/* Reste du code */

...

...

...

/* Reste du code */

}

</code>

3 réponses

Avatar
Christophe de VIENNE
chahnaz.ouzikene wrote:
Bonjour,

Evitons les blahblah : J'ai besion de créer une classe modélisant une
application OpenGL. Pour ce, j'ai besoin d'écrire une méthode qui prends une
méthode en paramètre, j'ai besoin de votre aide pour y parvenir car je ne
sais pas quelle syntaxe utiliser.


Apparemment tu veux aussi pouvoir donner en paramètre des fonctions
membres. Tu devrais regarder du côté des foncteurs. Par exemple :
http://www.boost.org/libs/bind/mem_fn.html
http://www.boost.org/libs/bind/bind.html


A+

--
Christophe de Vienne

Avatar
Falk Tannhäuser
Pointeur sur une méthode statique (ou une fonction libre) qui
renvoie 'void*' et qui ne prend pas de paramètres :

void* (*pfunc)();
...
class toto { public: static void* titi() { return 0; } };
pfunc = &toto::titi;
void* result = pfunc(); // Appel de la fonction pointée



Pointeur sur une méthode ordinaire de la classe "toto"
qui renvoie 'void*' et qui ne prend pas de paramètres :

class toto;
void* (toto::*pmemfunc)();
...
class toto { public: void* titi() { return 0; } };
pmemfunc = &toto::titi;
...
// Appel de la fonction pointée
toto t;
void* result = (t.*pmemfunc)();
ou
toto* pt = new toto;
void* result = (pt->*pmemfunc)();


Exemple d'une fonction qui prend un int,
un pointeur sur une telle méthode et
un double en paramètre :

void foo(int i, void* (toto::*pmemfunc)(), double d) { ... }

On gagne en lisibilité en utilisant un typedef :

typedef void* (toto::*ptr_toto_memfunc)();
void foo(int i, ptr_toto_memfunc pmemfunc, double d) { ... }

Falk
Avatar
chahnaz.ourzikene
Merci à tous les deux, surtout à Falk Tannahäuser. Vos méthodes marchent.

Encore merci.

"Falk Tannhäuser" a écrit dans le message de
news: cmg5eg$kfi$
Pointeur sur une méthode statique (ou une fonction libre) qui
renvoie 'void*' et qui ne prend pas de paramètres :

void* (*pfunc)();
...
class toto { public: static void* titi() { return 0; } };
pfunc = &toto::titi;
void* result = pfunc(); // Appel de la fonction pointée



Pointeur sur une méthode ordinaire de la classe "toto"
qui renvoie 'void*' et qui ne prend pas de paramètres :

class toto;
void* (toto::*pmemfunc)();
...
class toto { public: void* titi() { return 0; } };
pmemfunc = &toto::titi;
...
// Appel de la fonction pointée
toto t;
void* result = (t.*pmemfunc)();
ou
toto* pt = new toto;
void* result = (pt->*pmemfunc)();


Exemple d'une fonction qui prend un int,
un pointeur sur une telle méthode et
un double en paramètre :

void foo(int i, void* (toto::*pmemfunc)(), double d) { ... }

On gagne en lisibilité en utilisant un typedef :

typedef void* (toto::*ptr_toto_memfunc)();
void foo(int i, ptr_toto_memfunc pmemfunc, double d) { ... }

Falk