Pointeur de fonction : au secours ! [VC++] - C++ - Programmation
Marsh Posté le 04-05-2004 à 11:43:05
le message st assez explicit eje pense :
pointeur sur membre != pointeur de fonction.
Regarde du coté de make_memptr ou passe ton membre en statique.
Marsh Posté le 04-05-2004 à 11:45:14
Joel F a écrit : le message st assez explicit eje pense : |
Ahem... Pardon ?
Marsh Posté le 04-05-2004 à 11:47:11
mem_fun_t pardon :
http://www.sgi.com/tech/stl/mem_fun_t.html
Marsh Posté le 04-05-2004 à 11:53:27
Merci
Mais... Il n'existe aucun moyen simple et standard pour passer une fonction membre en paramètre d'une autre fonction ?
Les pointeurs de fonction sont forcément compliqués à utiliser ?
Merdum
Marsh Posté le 04-05-2004 à 12:14:57
oh ya pas de destructeur virtuel
sinon les pointeurs de membres ça marche sans problème
Code :
|
Marsh Posté le 04-05-2004 à 12:46:23
J'ai l'impression que j'ai surtout un problème de syntaxe
ça va me rendre fou cette histoire
[Edit] Sinon, merci Taz, mais ton exemple ne m'aide pas... Mon problème est de passer une pointeur de fonction d'une classe à une autre, pas d'en créer un...
Marsh Posté le 04-05-2004 à 13:34:23
Kalipok a écrit : Merci |
ueh la STL c'est pas standard peut etre o_o
Marsh Posté le 04-05-2004 à 13:38:12
Joel F a écrit : ueh la STL c'est pas standard peut etre o_o |
Ok mais je me dis qu'il doit bien y avoir moyen de faire sans... non ?
Pas moyen de passer un pointeur sur une fonction non statique en paramètre d'une fonction ?
Marsh Posté le 04-05-2004 à 13:40:58
Kalipok a écrit : Ok mais je me dis qu'il doit bien y avoir moyen de faire sans... non ? |
moi je parle pour rien comme d'habitude
Marsh Posté le 04-05-2004 à 14:04:53
Taz a écrit : moi je parle pour rien comme d'habitude |
Trop succint
désolé
[Edit] Peut être ais je oublié de mentionner que ma classe CDialogMachin ne connait pas la classe CPageBidule... Pas de include, rien
Marsh Posté le 04-05-2004 à 14:17:44
Merci Joel et Taz, je vais utiliser une fonction statique...
Je regarderais quand même la solution de Joel plus tard pour voir...
Marsh Posté le 04-05-2004 à 14:22:41
non mais c'est quoi ce foutoire : je file un exemple d'utilisation de pointeur de fonctions membres, en long et en large, et non, ça va pas ... c'est bon je retiens ton joli pseudo pour la prochaine fois,
Marsh Posté le 04-05-2004 à 14:29:15
Taz a écrit : non mais c'est quoi ce foutoire : je file un exemple d'utilisation de pointeur de fonctions membres, en long et en large, et non, ça va pas ... c'est bon je retiens ton joli pseudo pour la prochaine fois, |
Marsh Posté le 04-05-2004 à 14:33:02
Taz a écrit : non mais c'est quoi ce foutoire : je file un exemple d'utilisation de pointeur de fonctions membres, en long et en large, et non, ça va pas ... c'est bon je retiens ton joli pseudo pour la prochaine fois, |
Ben étant donné que tu as l'air du genre à te vexer quand on ne comprends pas tout de suite, tu ne vas pas me manquer
[Edit] Je n'ai sûrement pas été clair... Pourtant Joel a bien répondu dans le sujet... lui...
[Edit2] J'ai édité le message initial, en espérant l'avoir clarifié un peu
Marsh Posté le 04-05-2004 à 20:26:52
En parcourant qqs posts je constate que tu (taz) as qqs problèmes de communication...
D'autant que tu es passé à côté de mon problème
Heureusement que Joel est là pour me montrer que mon post était compréhensible mais que tu n'as tout simplement pas pris la peine de le lire
Marsh Posté le 04-05-2004 à 22:31:21
La solution 'static' contraint fortement la classe départ ce qui est dommage. L'exemple déjà donné - par tu sais qui - est pourtant clair.
Donc, il est possible d'appeler une fonction membre quelconque d'une classe numéro 1 quelconque à partir d'une classe numéro 2 sans utiliser 'static'.
La syntaxe est lourde et je ne sais pas si c'est parfaitement correct. Cela dit, j'ai bricoler la chose suivante et ca marche.
Code :
|
Marsh Posté le 04-05-2004 à 22:36:01
Euh... pour ma défense : pourquoi faire simple qd on peut faire compliqué. Désolé
Marsh Posté le 04-05-2004 à 22:46:15
Franchement, je lis courament l'anglais et je trouve les explications fournies par SGI pas claires du tout sur mem_fun.
Marsh Posté le 04-05-2004 à 22:47:22
(void (Classe1::*)() const) ... pourquoi tu castes ?
fait un typedef et voilà ...
Marsh Posté le 04-05-2004 à 22:48:41
Oui, le typedef s'impose mais j'ai eu la fleme de l'ecrire.
Marsh Posté le 04-05-2004 à 22:53:50
Peux-tu donner un exemple tout bète de mise en oeuvre de mem_fun, stp ?
Marsh Posté le 04-05-2004 à 23:02:39
Pourtant, c'est calme là.
Marsh Posté le 04-05-2004 à 23:10:02
xterminhate a écrit : Pourtant, c'est calme là. |
Il suffirait que je dise que je ne vois pas comment appliquer vos exemples à mon cas pour déchaîner les passions
Marsh Posté le 04-05-2004 à 23:14:45
T'inquiètes! Ils ne viendront quand même pas chez toi pour te tabasser. Enfin... ne fais pas trop de bétises, on sait jamais!
Marsh Posté le 04-05-2004 à 23:22:40
xterminhate a écrit : T'inquiètes! Ils ne viendront quand même pas chez toi pour te tabasser. Enfin... ne fais pas trop de bétises, on sait jamais! |
Je suis sérieux en plus
Dans mon cas, il y a deux classes uniquement, pas de main() en vue (VC++ MFC tout ça...)
Ma classe A instancie ma classe B et souhaite lui passer un pointeur sur une de ses fonctions (A::fonction(paramètres)) pour que lors des traitements réalisés dans B, un certain état de B déclenche une réaction de A.
Je ne peux pas faire de typedef void (A::*fonction(blabla)) dans B puisque B ne connait pas A.
Enfin bon... le static, c'est pas si mal
Sinon, j'ai toujours le B::GetParent() de base, mais bon...
Marsh Posté le 04-05-2004 à 23:37:33
Je ne peux pas faire de typedef void (A::*fonction(blabla)) dans B puisque B ne connait pas A.
Ca veut dire quoi exactemet "ne connais pas" ? Tu peux faire un template si tu ne veux pas te lier à la classe A uniquement.
Marsh Posté le 04-05-2004 à 23:58:01
xterminhate a écrit : Je ne peux pas faire de typedef void (A::*fonction(blabla)) dans B puisque B ne connait pas A. |
Par "ne connais pas", j'entends qu'il n'y a pas d'include du fichier définissant la classe A.
Pour le template : à quel niveau ? Transformer ma classe B (qui je le rappelle est une CDialog) ?
Bon... J'avoue que l'objectif est plus de faire un code simple et compréhensible rapidement plus que de faire du code optimisé , le static risque donc d'être retenu
Marsh Posté le 05-05-2004 à 09:16:50
Tu compiles qd même A et B en même temps, non ?
Marsh Posté le 05-05-2004 à 09:18:53
xterminhate a écrit : Peux-tu donner un exemple tout bète de mise en oeuvre de mem_fun, stp ? |
et dis donc, ta touche Scroll Down est cassée ?
Code :
|
Marsh Posté le 05-05-2004 à 09:46:05
Si, elle marche tres bien ma touche!
Mais, il s'agit de l'exemple donné partout. Je le connais par coeur Non, si tu as un autre exemple sans foreach, ca m'interesse toujours.
mem_fun(&B::print) correspond a l'appel du constructeur ?
mem_fun crée une fonction objet de telle manière que l'appel de son operateur en passant l'addresse d'un classe de type de base B execute la fonction print() ?
Marsh Posté le 05-05-2004 à 10:35:30
xterminhate a écrit : Tu compiles qd même A et B en même temps, non ? |
Ben... oui... fatalement
Sinon por mem_fun, il est clair que la page de sgi n'est pas franchement limpide... Encore moins si l'on souhaite passer des variables dans la fonction pointée
Marsh Posté le 05-05-2004 à 10:57:38
xterminhate a écrit : |
rtfm
xterminhate a écrit : |
oui
Marsh Posté le 05-05-2004 à 11:30:36
rtfm ... oui mais bon, a priori il a pas besoin de tout ça ...
Marsh Posté le 05-05-2004 à 13:33:47
D'ailleurs... J'ai mis (en gros) mon code dans le premier message... Il aurait été aussi rapide de l'éditer pour mettre le code correct dedans...
En recoupant mon code et vos exemples, je serais certainement parvenu à qq chose, mais là...
Marsh Posté le 04-05-2004 à 11:41:36
Bon... Je suis mauvais
J'ai besoin d'un pointeur de fonction, mais pas moyen de m'en sortir
[En gros]
J'ai une classe A qui en instancie une autre B. La classe B ne connait rien de la classe A.
Je souhaite passer un pointeur sur une des fonctions de A à B, cette fonction n'étant pas statique.
[/En gros]
J'ai un truc dans ce genre là :
à la compilation, j'ai une erreur :
'SetCallBackGestionEtat' : cannot convert parameter 1 from 'void (enum CDialogMachin::ETAT)' to 'void (__cdecl *)(enum CDialogMachin::ETAT)'
Cette erreur pointe sur la ligne où je tente (comme un gorêt) de passer ma fonction en paramètre
Bon... Je pleure Je ne sais pas comment faire
Message édité par Kalipok le 04-05-2004 à 14:50:53