pointeur de fonction ou fonction ? - C++ - Programmation
Marsh Posté le 03-09-2002 à 17:48:17
je comprend pas bien ta question.
Marsh Posté le 03-09-2002 à 18:09:50
J'ai utilisé les pointeurs de fonctions une fois, quand j'ai réalisé un interprète de commandes sous linux.
C'est utile pour stocker les fonctions dans des tableaux. Comme ça à partir d'un nom de commande je peut retouver facilement quelle fonction appeler. La maintenance (ajout et suppression de fonctionnalités) est hyper simple : il suffit de rajouter une cellule au tableau de fonctions.
Marsh Posté le 03-09-2002 à 18:11:19
Tu devrais preciser un peu ta question.
D'ordre general, on utilise des pointeurs de fonction pour des "callbacks". Pour des fonctions comme qsort, par exemple.
Sinon, si t'es en C++ (donc objet), c'est moins necessaire vu que tu peux surcharger les methodes de tes classes.
Mais je sais pas si je reponds rellement a ta question.
Marsh Posté le 03-09-2002 à 18:38:12
plus ou moins...
en fait je veux savoir dans quels intérêts je peux me servir d'un pointeur de fonction au lieu d'appeler une fonction par son nom (lassiquement) je vois pas ce que je peux dire de plus
Marsh Posté le 03-09-2002 à 18:43:10
picshertho a écrit a écrit : plus ou moins... en fait je veux savoir dans quels intérêts je peux me servir d'un pointeur de fonction au lieu d'appeler une fonction par son nom (lassiquement) je vois pas ce que je peux dire de plus |
Ben typiquement quand tu connais pas le nom de la fonction à l'avence. Soit tu passe un ponteur à une fonction pour qu'elle en appelle une autre. Soit tu choisie dans un tableau la bonne à lancer. C les deux exemple les plus courants
Marsh Posté le 03-09-2002 à 18:55:16
Comme par exemple lors du chargement "manuel" de DLL, voir http://forum.hardware.fr/forum2.ph [...] h=&subcat=
Marsh Posté le 04-09-2002 à 03:44:08
Quand tu as besoin de changer à l'exécution la fonction appelée par ton code.
Ceci:
Code :
|
peut être remplacé par cela:
Code :
|
Marsh Posté le 04-09-2002 à 08:39:20
Musaran a écrit a écrit : En C il est facile de se flinguer le pied. Le C++ rends cela plus dur, mais quand on y arrive, c'est la jambe entière qui part. (pensée de Bjarne Stroustrup) |
Marsh Posté le 04-09-2002 à 10:19:02
Sauf chargement de DLL, jamais de pointeurs de fonction en C++
Utilise des foncteurs à la place...
Sinon en C oui, pour des callback, ou pour eviter des switch trop importants (tableaux de pointeurs)
Marsh Posté le 04-09-2002 à 11:16:57
Verdoux a écrit a écrit : Comme par exemple lors du chargement "manuel" de DLL, voir http://forum.hardware.fr/forum2.ph [...] h=&subcat= |
Enfin c'est pas le topic le plus interessant qui porte sur le sujet.
Mais quand tu charges une dll dynamiquement (runtime), effectivement tu as besoin des pointeurs de fonction.
Marsh Posté le 05-09-2002 à 03:32:09
Harkonnen a écrit a écrit : |
Je sais pas pourquoi elle m'a bien plu celle-là .
Marsh Posté le 05-09-2002 à 11:20:28
BENB a écrit a écrit : Sauf chargement de DLL, jamais de pointeurs de fonction en C++ Utilise des foncteurs à la place... Sinon en C oui, pour des callback, ou pour eviter des switch trop importants (tableaux de pointeurs) |
C'est quoi un foncteur ?
D'autre part quelqu'un aurait-il la gentillesse de me rappeler la syntaxte de définition d'un pointeur de fonction membre d'une classe ?
Marsh Posté le 05-09-2002 à 11:26:15
Toxin a écrit a écrit : C'est quoi un foncteur ? D'autre part quelqu'un aurait-il la gentillesse de me rappeler la syntaxte de définition d'un pointeur de fonction membre d'une classe ? |
typeDeRetour (Class::*)(args);
Un truc comme ça, je vérifie.
Marsh Posté le 05-09-2002 à 11:31:46
letoII a écrit a écrit : typeDeRetour (Class::*)(args); Un truc comme ça, je vérifie. |
Non c'est une classe qui a un opérateur (), c'est à dire dont les instances sont appelables.
Marsh Posté le 05-09-2002 à 11:40:13
Verdoux a écrit a écrit : Non c'est une classe qui a un opérateur (), c'est à dire dont les instances sont appelables. |
non c bien ça
Code :
|
Marsh Posté le 05-09-2002 à 11:48:57
letoII a écrit a écrit : non c bien ça |
http://casteyde.christian.free.fr/ [...] x5200.html
Marsh Posté le 05-09-2002 à 11:52:09
Verdoux a écrit a écrit : http://casteyde.christian.free.fr/ [...] x5200.html |
Oaui, ça c un foncteur effectivement. E alors? je parlais des pointeur sur fonction membre moi, mais c pas grave
D'ailleur l'utilité des foncteurs ne me semble pas être le meêm que celle des pointeurs sur fonction membre masi bon pas assez pratiqué pour juger.
Marsh Posté le 05-09-2002 à 16:52:24
Toxin a écrit a écrit : Merci et pour l'autre question ? |
Un foncteur est une classe pour laquelle l'operateur () est defini, une instance de cette classe peut donc etre utilisée comme une fonction, et un pointeur sur cette classe commeun pointeur de fonction.
L'avantages est que comme on passe une classe on peut y ajouter des membres :
par exemple
Code :
|
Marsh Posté le 05-09-2002 à 18:19:38
en quoi un foncteur peut-il remplacer un pointeur de fonction?
tu veux parler des applications generiques style <algorithm> ou c'est une erreur de passer un pointeur de fonction?
sinon dans les autres cas: pointeur de fonction = fonction dont le corps est non défini à la compilation mais défini à l'execution, foncteur = objet/fonction connu à la compilation.
pour moi ca ne se recoupe pas trop mais peut-etre que je me trompe.
LeGreg
Marsh Posté le 06-09-2002 à 10:53:12
Personnellement j'ai par le passé créé un automate à état et la solution la plus élégante passait par les pointeurs de fonction membre.
Marsh Posté le 06-09-2002 à 13:34:31
legreg a écrit a écrit : en quoi un foncteur peut-il remplacer un pointeur de fonction? tu veux parler des applications generiques style <algorithm> ou c'est une erreur de passer un pointeur de fonction? sinon dans les autres cas: pointeur de fonction = fonction dont le corps est non défini à la compilation mais défini à l'execution, foncteur = objet/fonction connu à la compilation. pour moi ca ne se recoupe pas trop mais peut-etre que je me trompe. LeGreg |
Un pointeur de fonction est une forme de foncteur...
Si tu ne veux pas que le coprs du foncteur soit defini à la compilation tu peux utiliser des fonctions virtuelles ou des templates...
Marsh Posté le 06-09-2002 à 13:54:36
Citation : Un pointeur de fonction est une forme de foncteur... |
Oui bien sur, sauf que pour qu'on puisse s'entendre j'ai repris ta definition de "foncteur" (deux posts plus haut).
Citation : Si tu ne veux pas que le coprs du foncteur soit defini à la compilation tu peux utiliser des fonctions virtuelles ou des templates... |
ok pour les fonctions virtuelles puisque ca utilise en gros un tableau de pointeurs pour savoir quelle fonction appeler au runtime et c'est plus propre a faire en orienté objet (en java c'est le seul moyen..).
Pas d'accord pour les templates qui sont bien définis au compilation time (et je ne te parle pas des templates avec fonctions virtuelles qui melangent deux notions differentes).
LeGreg
Marsh Posté le 06-09-2002 à 14:04:45
legreg a écrit a écrit :
|
Le foncteur est souvent utilisé par des fct templates, et l'utilisation d'un pointeur de fct dans ce contexte est souvent possible...
Je suis d'accord pour le template c'est n'est pas a proprement parler du "run-time". Je pensais à une fct call-back comme dans le cas d'un solveur, à l'écriture du solveur tu ne sais pas quelle fonction devra etre appellé, en C tu utilisera un pointeur de fonction. En C++ la methode C marche toujours, mais tu peux en plus jouer sur template/foncteur ou foncteur virtuel... Je prefere la premiere forme(template/foncteur)
Generalement ces solveurs sont compilées et livrés dans desbibliotheques, le template retarde le moment de la compilation, pour celui qui ecrit le solveur tout se passe comme si c'était resolu en "run-time"...
Marsh Posté le 06-09-2002 à 14:13:54
oui je crois qu'on est d'accord
en C++, grace a la programmation generique
tu reduis le champ d'application du pointeur
de fonction (comparaison de l'efficacité de la fonction
qsort de cstdlib, et de la fonction std::sort de <algorithm> ),
ceci dit c'est une lacune (comblée)
du C, et le pointeur de fonction a encore
son utilité en C++ (meme déguisé sous forme
de methode virtuelle)
A+
LeGreg
Marsh Posté le 06-09-2002 à 15:48:04
legreg a écrit a écrit : oui je crois qu'on est d'accord en C++, grace a la programmation generique tu reduis le champ d'application du pointeur de fonction (comparaison de l'efficacité de la fonction qsort de cstdlib, et de la fonction std::sort de <algorithm> ), ceci dit c'est une lacune (comblée) du C, et le pointeur de fonction a encore son utilité en C++ (meme déguisé sous forme de methode virtuelle) A+ LeGreg |
Mon discours était simplement de dire que le C++ apportait des techniques plus interessantes que le pointeur de fonction. Et que dans une conception purement C++ il était (a mon avis) préférable de ne pas utiliser de pointeurs de Fonctions...
Les contres-exemples ? ceux que je cites sont mauvais puisqu'il sont en fait des cas de compatibilité avec le C :
-Chargement explicite de DLL
-Fct call-back
Marsh Posté le 07-09-2002 à 02:21:00
Les pointeurs de fonction sont puissants mais dangereux.
L'utilisation d'un tel pointeur non/mal initialisé engendre l'exécution de n'importe quoi, ce qui est beaucoup plus grave que le classique lire/écrire n'importe où.
Marsh Posté le 03-09-2002 à 17:34:26
salut, j'ai une question
dans quel cas il est préférable d'utiliser un pointeur de fonction pour appeler une fonction et dans quel cas ca n'en vaut pas la peine ?
merci