8
votes

Fonction de rappel dans FreeGlut à partir de l'objet

J'utilise MSVC ++ et Freeglut afin d'utiliser OpenGL. Maintenant, j'ai une classe appelée caméra , qui est assez simple, mais elle contient également la fonction pour le remodelage de ma fenêtre.

Ma question est la suivante: Comment puis-je définir glutreshapefunc ( void (* rappel) (int, int)) à ma fonction dans ma caméra?

J'ai le code suivant, qui ne fonctionnera pas, à cause d'une erreur de compilateur: xxx

et ma classe de caméra ressemble à ceci dans caméra.h : xxx

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.


0 commentaires

4 Réponses :


2
votes

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.


0 commentaires

10
votes

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 arbitraire * userData à votre rappel, de sorte que vous ne pouvez pas transmettre l'objet de cette manière non plus.

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 de la caméra en quelque sorte, via une statique et / ou variable globale.

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.


0 commentaires

2
votes

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.


4 commentaires

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)' . Et l'ajout d'une __cdecl explicite donne un avertissement sur la caméra : -Part.


@Marnix: the __ thiscall me suggère que glutreshapefunc n'est pas déclaré comme statique .


@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);



0
votes

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 xxx

}

voici la caméra.cpp xxx

et sa caméra en-tête.h xxx

Notez l'utilisation d'un pointeur de classe global C ++ ptr_global_instance


0 commentaires