1
Général / [résolu] Pointeur sur fonction membre
« le: Janvier 26, 2019, 09:09:28 pm »
Bonjour,
J'essaye de réaliser une fonction prenant en paramètre un pointeur sur une autre fonction.
Pour illustrer mon problème, j'ai créé une classe A qui gère un string, une classe B qui gère une collection de A (en utilisant les vectors) et une procédure doStuff qui créé un iterator parcourant la collection et applique la fonction passée en paramètre. Pour le bien de cet exemple, j'ai écris deux fonctions membres dans B qui mettent respectivement un string en majuscule et en minuscule.
Le but attendu : Dans le main, je peux un coup appeler doStuff(stringToLowerCase) et il va afficher "hello world", puis doStuff(stringToUpperCase) et il affichera "HELLO WORLD".
Mon implémentation est la suivante :
Je définis un type fctDoStuffOnList dans B, c'est un type de fonction qui prend en paramètre un string &.
B dispose aussi des deux fonctions stringToLowerCase(string &) et stringToUppercase(string &), que je suis censé passer en paramètre dans main à l'appel de doStuff(...).
Mon problème est que dans le corps de doStuff, à l'endoit "fct(*it)" j'obtiens une erreur "l'expression qui précède les parenthèses de l'appel apparent doit avoir le type de fonction (pointeur-à-)".
J'ai un peu d'expérience en ce qui concerne les pointeurs de fonctions, mais je n'avais jamais essayé d'utiliser des pointeurs sur des fonctions membres non-statiques.
Je ne comprends pas comment corriger cette erreur. J'ai déjà fait des pointeurs sur des fonctions non membres, du style :
Toute aide est bienvenue !
----------------------------------------
Edit : J'ai fini par trouver la solution tout seul peu de temps après avoir posté ce pavé.
Je l'ai mis en rouge pour indiquer ce qu'il me manquait.
Je compte laisser ce post en ligne à titre d'exemple (sauf si un modérateur me demande de l'enlever bien sûr).
De ce que j'ai compris, l'appel à "fct" devait se faire par un pointeur sur une classe. On s'en fiche de la valeur de ce pointeur, tout ce qui compte est que l'appelle à "fct" parte de quelque part. Ce quelque part est donc "this->*".
J'essaye de réaliser une fonction prenant en paramètre un pointeur sur une autre fonction.
Pour illustrer mon problème, j'ai créé une classe A qui gère un string, une classe B qui gère une collection de A (en utilisant les vectors) et une procédure doStuff qui créé un iterator parcourant la collection et applique la fonction passée en paramètre. Pour le bien de cet exemple, j'ai écris deux fonctions membres dans B qui mettent respectivement un string en majuscule et en minuscule.
Le but attendu : Dans le main, je peux un coup appeler doStuff(stringToLowerCase) et il va afficher "hello world", puis doStuff(stringToUpperCase) et il affichera "HELLO WORLD".
Mon implémentation est la suivante :
Je définis un type fctDoStuffOnList dans B, c'est un type de fonction qui prend en paramètre un string &.
B dispose aussi des deux fonctions stringToLowerCase(string &) et stringToUppercase(string &), que je suis censé passer en paramètre dans main à l'appel de doStuff(...).
Mon problème est que dans le corps de doStuff, à l'endoit "fct(*it)" j'obtiens une erreur "l'expression qui précède les parenthèses de l'appel apparent doit avoir le type de fonction (pointeur-à-)".
J'ai un peu d'expérience en ce qui concerne les pointeurs de fonctions, mais je n'avais jamais essayé d'utiliser des pointeurs sur des fonctions membres non-statiques.
(click to show/hide)
Je ne comprends pas comment corriger cette erreur. J'ai déjà fait des pointeurs sur des fonctions non membres, du style :
(click to show/hide)
Toute aide est bienvenue !
----------------------------------------
Edit : J'ai fini par trouver la solution tout seul peu de temps après avoir posté ce pavé.
Je l'ai mis en rouge pour indiquer ce qu'il me manquait.
Je compte laisser ce post en ligne à titre d'exemple (sauf si un modérateur me demande de l'enlever bien sûr).
De ce que j'ai compris, l'appel à "fct" devait se faire par un pointeur sur une classe. On s'en fiche de la valeur de ce pointeur, tout ce qui compte est que l'appelle à "fct" parte de quelque part. Ce quelque part est donc "this->*".