Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fonction membres statiques / callback

4 réponses
Avatar
PurL
Bonjour,

Je bute toujours sur le meme probleme : appeler une fonction membre d'un
objet qui à été passée en parametre à un autre objet pour la rappeler plus
tard. Pour que ce soit possible, il faut que la fonction membre soit
statique, mais si elle est statique, on perd la porté des variables membres
du meme objet.

Je m'explique par un exemple :

- Je développe une application (avec BCB5 sous Windows 2000) qui manipule
une liste de grandeurs.
- Dans plusieurs fenetres, j'ai besoin d'avoir acces à ces grandeurs pour
diverses raison (en créer d'autre, les modifier, les intégrer dans d'autres
fonctionnalités, ...)
- Pour éviter d'écrire à chaque fois le code qui permet d'avoir acces à ces
grandeurs, je l'écris une fois pour toute dans, ce qu'appelle BCB, une frame
(une frame à la possibilité de pouvoir etre intégrée graphiquement à une
fenetre)
- pour que ma fenetre qui recoit cette frame puisse interagir avec elle, le
constructeur de la frame recoit en parametre une fonction membre de la
fenetre
- et quand j'ai sélectionné une grandeur, la frame appelle la fonction
membre de son conteneur à savoir la fenetre pour que celle-ci puisse
utiliser la grandeur sélectionnée.
-Comme je l'ai dit ci-dessus, cela ne marche que si cette fonction membre
est statique, mais du coup à l'interieur de cette fonction, je ne peux
réagir avec le reste de l'objet (la fenetre)


Comment résoudre ce probleme joliement ?

Merci pour votre aise,

PurL

4 réponses

Avatar
Fabien LE LEZ
On Thu, 5 Aug 2004 17:40:23 +0200, "PurL" :

Je bute toujours sur le meme probleme


Tu n'es pas le seul : y'a au moins un post par mois sur la même
question.

Typiquement, un système de callback se présente ainsi :

typedef .... Fonction;
void FctAvecCallback (Fonction callback, void* opaque,
parametres_divers);


et ton code doit ressembler à ceci :

struct C
{
void CallBack (parametres_divers);
static void static_CallBack (void *opaque, parametres_divers)
{ reinterpret_cast<C*>(opaque)-> CallBack (parametres_divers); }

void f()
{
FctAvecCallback (static_CallBack, this, ...);
}
};

Si tu veux plus d'infos, tout est là :
<http://www.google.com/advanced_group_search?hl=en>.


--
;-)

Avatar
Vincent Lascaux
Typiquement, un système de callback se présente ainsi :

typedef .... Fonction;
void FctAvecCallback (Fonction callback, void* opaque,
parametres_divers);


Ca m'etonne que tu n'aies pas donné la version C++

class callBack { public: virtual void run()=0; };
class hello : public callBack { public: void run() { std::cout << "Hello
world" << std::endl; } };
void FctAvecCallback(callBack* o) { o->run(); }

ou encore

template<class T>
void FctAvecCallback(T o) { o(); }

class hello { public : void operator() { std::cout << "Hello world" <<
std::endl; } };

Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Thu, 5 Aug 2004 17:40:23 +0200, "PurL" :

Je bute toujours sur le meme probleme


Tu n'es pas le seul : y'a au moins un post par mois sur la même
question.

Typiquement, un système de callback se présente ainsi :


Très souvent, le système de callback exige une fonction « extern "C" ».

typedef .... Fonction;
void FctAvecCallback (Fonction callback, void* opaque, parametres_divers);

et ton code doit ressembler à ceci :

struct C
{
void CallBack (parametres_divers);
static void static_CallBack (void *opaque, parametres_divers)
{ reinterpret_cast<C*>(opaque)-> CallBack (parametres_divers); }

void f()
{
FctAvecCallback (static_CallBack, this, ...);
}
};


Ce qui ne marche que si le FncAvecCallback est « extern "C++" ». Sinon,
il faut bien passer par une fonction libre.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
PurL
class callBack { public: virtual void run()=0; };
class hello : public callBack { public: void run() { std::cout <<
"Hello world" << std::endl; } };
void FctAvecCallback(callBack* o) { o->run(); }


Oui j'y ai bien pensé d'utiliser le systeme d'héritage.
Le probleme, c'est que sous builder, le debut de la classe descrptive de la
fenetre est :

class TfrmMaFenetre : public TForm

et si je rajoute :

class TfrmEditeurVariablesCalcul : public TForm, public callBack

BCB m'insulte car il ne retrouve plus la fenetre, mais bon ca c'est un autre
pb et c'est HS !

PurL