Appel d'une fonction virtuelle en C++
Fermé
moi1
Messages postés
27
Date d'inscription
jeudi 6 janvier 2005
Statut
Membre
Dernière intervention
23 mars 2007
-
8 nov. 2005 à 11:34
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007 - 9 nov. 2005 à 14:16
moi1 Messages postés 27 Date d'inscription jeudi 6 janvier 2005 Statut Membre Dernière intervention 23 mars 2007 - 9 nov. 2005 à 14:16
A voir également:
- Appel d'une fonction virtuelle en C++
- Fonction si et - Guide
- Appel inconnu - Guide
- Machine virtuelle windows - Guide
- Nommez une application d'appel vidéo ou de visioconférence - Guide
- Regle virtuelle - Guide
6 réponses
Reeter
Messages postés
120
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
6 décembre 2005
8 nov. 2005 à 11:40
8 nov. 2005 à 11:40
peux tu mettre un bout du code que tu utilises stp ? (genre le code appelant la fonction, par exemple)
teebo
Messages postés
33491
Date d'inscription
jeudi 14 octobre 2004
Statut
Modérateur
Dernière intervention
24 février 2011
1 793
8 nov. 2005 à 12:26
8 nov. 2005 à 12:26
Salut,
Comme précisé dans l'autre post, en C# (donc sous réserve en c++) tu peux utiliser this.mafonction au moment de l'appel.
Comme précisé dans l'autre post, en C# (donc sous réserve en c++) tu peux utiliser this.mafonction au moment de l'appel.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
8 nov. 2005 à 12:33
8 nov. 2005 à 12:33
est tu sur que la variable d'apel de ta méthode est bien une Tool?
sinon, tu peux peu être utilise :
Tool(variable).methode();
mais comme dirai reeter : un exemple!
sinon, tu peux peu être utilise :
Tool(variable).methode();
mais comme dirai reeter : un exemple!
moi1
Messages postés
27
Date d'inscription
jeudi 6 janvier 2005
Statut
Membre
Dernière intervention
23 mars 2007
8 nov. 2005 à 13:25
8 nov. 2005 à 13:25
Je suis pas un vrai developpeur donc y'a surement des "trucs" qui m'echappent! En plus, c'est assez complexe car ce prog utilise plusieurs bibliothèques différentes.
J'ai un main qui déclare un objet de type Tool. Dans le constructeur de cet objet, je déclare un objet de type "Essai". Dans le constructeur de Essai, je déclare un objet de type GUI.
C'est correct jusque la ou y'a déja une betise?
Ensuite, l'utilisateur cliqe sur un bouton du menu qui doit appeler la fameuse methode "Clipping_Plane( )".
Le callback du bouton est "this->Clipping_Plane( )". Cette méthode est définie dans la classe GUI en virtual void. c'est donc la qu'est le probleme.
Je pense que l'objet qui appelle la méthode n'est pas l'objet de type Tool mais un autre, peut etre celui de Essai.
C'est difficile de mettre du code etant donné que c'est sur plusieurs fichiers et que finalement c'est "juste" un probleme d'appel mal placé je suppose.
Dites moi si qqch vous choque dans ce que je mets. C'est tres possible, encore une fois, je suis pas un pro!
J'ai un main qui déclare un objet de type Tool. Dans le constructeur de cet objet, je déclare un objet de type "Essai". Dans le constructeur de Essai, je déclare un objet de type GUI.
C'est correct jusque la ou y'a déja une betise?
Ensuite, l'utilisateur cliqe sur un bouton du menu qui doit appeler la fameuse methode "Clipping_Plane( )".
Le callback du bouton est "this->Clipping_Plane( )". Cette méthode est définie dans la classe GUI en virtual void. c'est donc la qu'est le probleme.
Je pense que l'objet qui appelle la méthode n'est pas l'objet de type Tool mais un autre, peut etre celui de Essai.
C'est difficile de mettre du code etant donné que c'est sur plusieurs fichiers et que finalement c'est "juste" un probleme d'appel mal placé je suppose.
Dites moi si qqch vous choque dans ce que je mets. C'est tres possible, encore une fois, je suis pas un pro!
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
8 nov. 2005 à 17:24
8 nov. 2005 à 17:24
Je pense que l'objet qui appelle la méthode n'est pas l'objet de type Tool mais un autre
Je pense aussi.
l'erreur type, il me semble serai d'avoir une fonction:
f(GUI a)
{a.Clipping_Plane();
}
et de faire l'apel en fesant :
Tool b;
f(b);
de ce cas la, il vaut mieu declarer "f" comme ça:
f(GUI& a){...}
je ne voi que ça.
Si tu peux, test :
Tool a;
a.Clipping_Plane();
(apel de la methode juste après la declaration)
pour voir si la bonne methode est apeler.
Je pense aussi.
l'erreur type, il me semble serai d'avoir une fonction:
f(GUI a)
{a.Clipping_Plane();
}
et de faire l'apel en fesant :
Tool b;
f(b);
de ce cas la, il vaut mieu declarer "f" comme ça:
f(GUI& a){...}
je ne voi que ça.
Si tu peux, test :
Tool a;
a.Clipping_Plane();
(apel de la methode juste après la declaration)
pour voir si la bonne methode est apeler.
Reeter
Messages postés
120
Date d'inscription
mercredi 13 août 2003
Statut
Membre
Dernière intervention
6 décembre 2005
9 nov. 2005 à 10:15
9 nov. 2005 à 10:15
Je me demande si son problème ne vient pas de sa callback (oui bon ok, évidemment me direz-vous...)
En fait, sa callback est définie virtuelle dans GUI. J'imagine qu'il se sert d'un MESSAGE_MAP qui fait le lien entre l'évènement qu'il veut choper et sa fonction callback. Le lien est donc fait dans la class GUI, et non dans Tool, ce qui expliquerait que cela soit la fonction implémentée dans GUI qui soit appelée... Enfin tout ceci n'est qu'une supposition
Est-ce possible de dériver des callback ? j'ai jamais essayé...
En fait, sa callback est définie virtuelle dans GUI. J'imagine qu'il se sert d'un MESSAGE_MAP qui fait le lien entre l'évènement qu'il veut choper et sa fonction callback. Le lien est donc fait dans la class GUI, et non dans Tool, ce qui expliquerait que cela soit la fonction implémentée dans GUI qui soit appelée... Enfin tout ceci n'est qu'une supposition
Est-ce possible de dériver des callback ? j'ai jamais essayé...
moi1
Messages postés
27
Date d'inscription
jeudi 6 janvier 2005
Statut
Membre
Dernière intervention
23 mars 2007
9 nov. 2005 à 14:16
9 nov. 2005 à 14:16
Ok, merci pour ces conseils.
Des que j'ai le temps, j'essaie ce que vous m'avez dit.
Pour te repondre reeter, ma methode est virtuelle pour pouvoir le redefinir dans une classe fille. Ca marche quand je redefinie la methode dans la premiere classe fille. Mais quand je redefinie dans la deuxieme, c'est toujours la dfinition de GUI qui est appelée (sauf si je redefinie egalement dans Essai, auquel cas c'est celle ci qui est utilisée).
Pour moi ca doit etre un probleme d'objet mal declaré ou au mauvais endroit.
Je vais VRAIMENT apprendre le C++ avec un vrai bouquin!
Merci pour vos conseils!
Des que j'ai le temps, j'essaie ce que vous m'avez dit.
Pour te repondre reeter, ma methode est virtuelle pour pouvoir le redefinir dans une classe fille. Ca marche quand je redefinie la methode dans la premiere classe fille. Mais quand je redefinie dans la deuxieme, c'est toujours la dfinition de GUI qui est appelée (sauf si je redefinie egalement dans Essai, auquel cas c'est celle ci qui est utilisée).
Pour moi ca doit etre un probleme d'objet mal declaré ou au mauvais endroit.
Je vais VRAIMENT apprendre le C++ avec un vrai bouquin!
Merci pour vos conseils!
mamiemando
Messages postés
33491
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
24 janvier 2025
7 817
9 nov. 2005 à 14:15
9 nov. 2005 à 14:15
Est ce que les méthodes des classes mère sont bien toutes virtual ?
Enfin bon, soit dit en passant, le virtual en c++ c'est mal (c'est pour que le lien dynamique n'est pas fait automatiquement en c++, comme c'est le cas en java). En effet le compilo est du coup obliger de garder une référence vers ta classe mère pour voir quelle méthode tu exécutes par le lien dynamique.
A tester peut-être peux tu directement appeler la méthode dans ta section de code avec :
Bonne chance
Enfin bon, soit dit en passant, le virtual en c++ c'est mal (c'est pour que le lien dynamique n'est pas fait automatiquement en c++, comme c'est le cas en java). En effet le compilo est du coup obliger de garder une référence vers ta classe mère pour voir quelle méthode tu exécutes par le lien dynamique.
A tester peut-être peux tu directement appeler la méthode dans ta section de code avec :
Tool::methode()
Bonne chance