peut on passer une methode en parametre ? - C++ - Programmation
Marsh Posté le 15-01-2003 à 20:51:49
en C++Builder y a moyen mais ça n'a pas l'air standard du tout
(pour émuler les procedure/function of object du Pascal)
Marsh Posté le 15-01-2003 à 20:58:50
avec des pointeurs de fonction membre, je dirais..
un truc du genre
Code :
|
à tester..
Marsh Posté le 15-01-2003 à 21:04:30
il est possible de passer une fonction en parametre..;mais men rappelle plus comment kon fait.. mais c possible
Par contre, une methode.. faut voir... peut etre oui.. peut etre non
Marsh Posté le 16-01-2003 à 05:10:46
Ça devrait donner ça:
Code :
|
Voici le prédicat générique:
Code :
|
Code :
|
Il y a peut-être moyen de surcharger un même nom, mais mon compilateur n'en veut pas.
Si tu veux l'utiliser comme prédicat pour les algorithmes stl, démerde-toi.
(Il faut jouer avec des adaptateurs bind1st imbriqués, tu veux vraiment qu'on creuses ça ?)
Marsh Posté le 16-01-2003 à 07:51:16
je vais voir ça cet apres midi.
Sinon si ça peut generecisé mon code et m'eviter de faire une fonction de recherche par objet et par attribut ça m'arrangerait.
Marsh Posté le 16-01-2003 à 08:17:24
wouatouwouatou a écrit : il est possible de passer une fonction en parametre..;mais men rappelle plus comment kon fait.. mais c possible |
une methode, c'est aussi une fonction, donc tu la passes en pointeur et c'est regle ....
Marsh Posté le 16-01-2003 à 09:30:28
BotMan a écrit : une methode, c'est aussi une fonction, donc tu la passes en pointeur et c'est regle .... |
hum une méthode c'est une fonction qui a un param en plus : le pointeur vers l'objet auquel appartient la méthode (this)
Marsh Posté le 17-01-2003 à 05:37:34
Les pointeurs sur membres sont plus complexes: ils ont le double type de l'objet et du membre.
Allons-y:
Code :
|
Exemple:
Code :
|
C'est quoi le prochain truc que tu vas demander ?
Marsh Posté le 23-01-2003 à 05:26:55
Les pointeurs de membre (on va dire pm) ne sont pas comme les autres pointeurs des adresses, ce sont des offset: distance entre le membre et le début de l'objet.
::* est l'opérateur utilisé pour déclarer un pm.
.* est l'opérateur utilisé pour suivre un pm
Code :
|
Mais pourquoi le type de l'objet fait-il partie du type du pm ?
C'est parce que les pm supportent le mécanisme virtuel.
Il leur est donc nécessaire de savoir à quel type d'objet ils s'appliquent, pour savoir s'il le virtuel s'applique, et si c'est le cas où se trouve le pointeur de table virtuelle (invisible).
C'est chaud tout ça... je n'ai compris que récemment.
Marsh Posté le 23-01-2003 à 05:49:09
Marsh Posté le 23-01-2003 à 09:57:09
J'ai reussit a l'implementer et c'est vraiment supper pratique, ça m'arrange vraiment.
Par contre j'ai reussit a faire une fonction qui prend un membre en parametre, mais pas reussit a faire en sorte que cette même fonction appelle une autre fonction qui prend un membre en paramtre. (le même parametre en fait).
Je vois pas comment faire passer le bidule.
J'aurais voulu que search member appelle test_member pour la comparaison, mais j'ai pas reussit.
Ce que je tente de faire va sans doute etre discuté par crtaines personnes, mais spa grave
J'ai du mal avec les const etc.
Code :
|
Marsh Posté le 23-01-2003 à 10:20:37
personne n'a palé des memfun?
http://www.sgi.com/tech/stl/mem_fun_t.html
c'est plus simple à mon avis
Marsh Posté le 23-01-2003 à 11:10:05
farib a écrit : merci pour moi |
C'etait pour la geniale clarification de Musaran precedent mon post.
A+,
Marsh Posté le 24-01-2003 à 09:03:24
Si ça continues je vais y prendre goût.
Tu sais qu'on a droit à 10 smileys par post ?
Après réflexion je peut étoffer l'explication, on reprends:
????
Les pointeurs de membre (on va dire pm) ne sont pas comme les autres pointeurs des adresses, ce sont des offset: distance entre le membre et le début de l'objet.
Les opérateurs de membre:
Code :
|
Base de travail
Code :
|
Exemple
Code :
|
Le pm ne se déréférence qu'associé avec un objet.
Normal: c'est un décalage sur quelque chose.
Mais pourquoi le type de l'objet fait-il partie du type du pm ?
1) La sécurité de type à la compilation.
Si on pouvait appliquer le pm à n'importe quel objet, il n'y aurait pas forcément le bon membre au bon offset.
2) Parce que les pm supportent le mécanisme virtuel.
Il leur est donc nécessaire de savoir à quel type d'objet ils s'appliquent, pour savoir s'il le virtuel a lieu, et si c'est le cas où se trouve le pointeur de table virtuelle (invisible).
Pour ces raisons, le pm méthode subit les contraintes d'un membre. Alors que c'est une adresse globale de fonction (comme un pointeur banal), puisque les fonctions ne sont pas physiquement dans l'objet.
????
C'est plus long mais mieux détaillé... c'est bon ou pas ?
karim63:
Code :
|
À priori c'est comme ça:
Code :
|
Mais je teste pas.
++Taz a écrit a écrit : personne n'a palé des memfun? |
Je crois que c'est pas compatible avec ça:
Citation : eviter de faire une fonction de recherche par objet et par attribut |
Enfin je suis pas sûr là...
C'est de plus en plus ce qu'on fait ici.
Ah au fait, les "adaptateurs bind1st imbriqués" ne peuvent pas marcher directement, vu que ces adaptateurs ne manipulent que des fonctions à deux argument.
Marsh Posté le 24-01-2003 à 09:18:03
Nous disons donc 10 smileys? voilà, voilà!
A+,
Marsh Posté le 15-01-2003 à 20:45:09
par exemple je voudrais faire ça:
j'ai un type liste deja defini d'objet de type O.
liste<O> l;
O& cherche(int x, (aucune idée du type) fget )
{
O obj;
for(int i=1;i<=tailleliste;i++)
{
obj=l[i];
if (x==obj.fget()) {return obj;};
};
ça donnerait:
O* po= & l.cherche(5,getx());
Y a pas moyen de faire un truc dans le style ?