J'utilise MSVC ++ et Freeglut afin d'utiliser OpenGL. Maintenant, j'ai une classe appelée Ma question est la suivante: Comment puis-je définir J'ai le code suivant, qui ne fonctionnera pas, à cause d'une erreur de compilateur: p > et ma classe de caméra ressemble à ceci dans caméra.h em>: p> peut-être que ceci est peut-être juste Une question de rappel plus générale, mais la seule chose que j'ai trouvée sur Internet, crée une classe wrapper autour du rappel. Mais cela ne semble pas que cela devrait être si difficile.
Merci d'avance. p> p> caméra code>, qui est assez simple, mais elle contient également la fonction pour le remodelage de ma fenêtre.
glutreshapefunc ( void (* rappel) (int, int)) code> à ma fonction dans ma caméra? p>
4 Réponses :
Vous ne pouvez pas le connecter directement. Reshapecamera est une fonction de membre, elle a besoin d'une instance de caméra afin de courir. Le rappel de glit est une fonction C, qui n'a pas d'instance de caméra pour appeler votre méthode. Vous devez créer une fonction qui appelez la méthode de la caméra Remodape. P>
Il n'y a pas de moyen propre pour le faire. C Ne sait pas sur les objets, les pointeurs-to-membres ne fonctionnent pas. C Ne fait pas de modèles, alors les foncteurs ne fonctionnent pas. L'API ne vous permet pas même de passer un annulement Donc, en effet, vous devrez créer une fonction wrapper qui n'est pas une fonction de membre, et vous devrez donner accès à l'instance d'objet code> de la caméra code> en quelque sorte, via une statique et / ou variable globale. P>
S'il y a eu plusieurs objets d'écoute pour cet événement, vous pouvez créer une classe singleton qui vous permet d'enregistrer des auditeurs arbitraires. P> arbitraire * userData code> à votre rappel, de sorte que vous ne pouvez pas transmettre l'objet de cette manière non plus. P>
Cela n'a rien à voir avec une chose "C vs C ++". Il vous suffit de comprendre ce que l'appel de la fonction de membre implique et essentiellement de ce qu'elle compile jusqu'à.
void MyClass::memberFunction() // This is the declaration the programmer sees. void memberFunction(MyClass* this) // This is what the compiler sees.
J'ai donc créé une fonction statique dans ma classe maintenant, mais il semble que cela ne puisse pas convertir de __thiscall en __decl. Erreur 1 Erreur C2664: 'GLUTRESHAPEFUNCUNCY': impossible de convertir le paramètre 1 de 'void (__thiscall caméra :: *) (int, int)' to 'vide (__cdecl *) (int, int)' code>. Et l'ajout d'une __cdecl explicite donne un avertissement sur la caméra
: code> -Part.
@Marnix: the __ thiscall code> me suggère que
glutreshapefunc code> n'est pas déclaré comme
statique code>.
@THOMAS: Non, le glutreshapefunc n'est probablement une fonction en C, la fonction provenant de ma classe de caméra est statique, mais a donc un autre espace de noms. Donc, cela ne semble pas obtenir cela.
glutreshapefunc (appareil photo :: reshapecamera);
Ce qui suit montre comment enregistrer une fonction de rappel C de C ++ Son généralement utile, non spécifique à la glutte.
Voici votre client C ++ programme p> } p> voici la caméra.cpp p > et sa caméra en-tête.h p> Notez l'utilisation d'un pointeur de classe global C ++ ptr_global_instance P> P> P> P >