Fonctions membres et fonctions classiques en callback - C++ - Programmation
Marsh Posté le 15-10-2007 à 14:49:18
sujet traiter 1000x, petite recherche sur le forum.
Pointer de fonction membre.
Y a même un "sujet utile" dessus
Marsh Posté le 15-10-2007 à 15:15:36
J'ai déjà cherché sur le forum, ya bien des réponses sur "comment appeler les fonctions à partir d'un pointeur", mais ça ne me dit pas si vraiment j'ai fait les choses correctement. Sachant que je souhaite que ça fonctionne aussi bien pour des fonctions membres static que des fonctions classiques.
Je vais encore chercher, merci quand même.
Marsh Posté le 15-10-2007 à 15:23:44
http://forum.hardware.fr/hfr/Progr [...] 3190_1.htm
Le truc c'est que pointeur de fonction membre et pointeur de fonction libre / fonction membre statique sont incompatibles, mais les 2 existent
Marsh Posté le 15-10-2007 à 15:44:31
Merci pour le lien, je n'avais effectivement pas vu ce topic...
Sinon, pour le moment je me limite au pointeurs de fonctions membres statiques et fonction libres.
J'avais une petite idée pour utiliser les pointeurs de fonctions membre, mais c'est apparamment impossible à utiliser si on ne connaît pas d'avance le nom de la class à laquelle appartient la fonction en question? je me trompe?
Marsh Posté le 15-10-2007 à 16:00:54
Effectivement. T'as un exemple d'utilsation que tu voudrais ? y a plein de techniques genre objet-fonctions qui permettent de travailler correctement.
Marsh Posté le 15-10-2007 à 16:08:51
En fait j'essais de me faire ma petite lib de gestion d'environnement en 2D, c'est plus expérimental qu'autre chose... Mais c'est assez instructif!
Ici j'aimerais pouvoir gérer les collisions d'objets. Donc quand on détecte une collision on appel une fonction (callback).
L'idée c'était de faire quelque chose d'assez générique, donc possibilité d'appeler une fonction membre statique ou non, ou encore une fonction libre.
Edit :
Ca donnerais une class qui stock un vecteur de structures contenant les infos sur une collision, et notamment la fonction a appeler en cas de collision.
Marsh Posté le 15-10-2007 à 16:21:49
par exemple, avec une base virtuelle Callback tu peux tout faire:
- Callback* make(X (*f)(Z));
- Callback* make<T>(X (*T::f)(Z), T*);
Marsh Posté le 15-10-2007 à 17:13:28
Pourrais-tu détailler juste un peu?
J'ai fais des recherches, testé plusieurs choses qui semblaient aller dans le sens de ce que tu propose... Mais rien qui ne fonctionne!
Marsh Posté le 16-10-2007 à 16:21:10
Code :
|
ça c'est l'idée de base d'une implémentation. maintenant le mieux c'est vraiment d'utiliser boost::bind
Marsh Posté le 16-10-2007 à 17:04:17
Taz a écrit : maintenant le mieux c'est vraiment d'utiliser boost::bind |
Ba justement c'est ce que je me suis mis à utiliser au fil de mes lectures. Ca va quand même mieux.
Mais j'aime aussi connaître les solutions disons... de base! Donc ce que tu propose ici m'intéresse aussi, ça va me faire quelque chose à étudier et tester. Merci bien.
Marsh Posté le 16-10-2007 à 23:12:44
Taz a écrit : ça c'est l'idée de base d'une implémentation. maintenant le mieux c'est vraiment d'utiliser boost::bind |
si seulement borland savait le gérer correctement...
Marsh Posté le 15-10-2007 à 14:30:07
Bonjour,
avant toutes choses, je tiens à préciser que je ne suis pas un as en C++, loin de là... Alors sachez être indulgeant.
Bref, dans le cadre de la réalisation d'un projet perso j'aurai à mettre en place une class permettant l'appel de fonctions en cas de détection de collisions entre objets (mais on se fou un peu de la finalité de tout ça). J'ai lu qu'il était impossible d'utiliser des fonctions membres non static comme fonction de callback, et ça parait assez logique d'après la doc que j'ai lu. Cette même doc préconise aussi de passer une instance de la class à la méthode static, en remplacement d'un appel à une méthode non static.
Donc j'essais de mettre en oeuvre tout cela avec quelques test.
J'en arrive à quelque chose de fonctionnel avec le code suivant :
Cet exemple est censé afficher "La valeur de b->i est : 100", et c'est bien ce qu'il se passe.
Je n'ais donc pas vraiment de problème.
Ceci-dit, j'essais de faire quelque chose d'assez générique. C'est à dire pouvant aussi bien être utilisé avec une fonction membre static ou une fonction classique. D'où la présence de void* instB=NULL.
Mes questions :
Cela vous parait-il correctement construit? (Excepté l'absence de header)
Puis-je faire mieux?
J'ai lu (je ne sais plus où) qu'on pouvait simplifier l'écriture de tout ça avec un typedef, mais je ne vois pas trop comment... Pouvez-vous m'éclairer?
En vous remerciant par avance,
bonne journée!
Message édité par dwogsi le 17-10-2007 à 07:29:37
---------------
-- Debian -- Le système d'exploitation universel | Le gras c'est la vie! | /(bb|[^b]{2})/