Phenix_ent
Messages postés5Date d'inscriptionmercredi 28 décembre 2005StatutMembreDernière intervention29 décembre 2005
-
28 déc. 2005 à 19:11
KeniiyK
Messages postés326Date d'inscriptionvendredi 13 août 2004StatutMembreDernière intervention 2 novembre 2007
-
27 janv. 2006 à 10:55
Bonjour,
Voilà, je développe un module graphique pour un jeu. L'OpenGL a besoin d'un pointeur sur fonction pour le display, mais ma fonction est dans une class et j'arrive pas a faire fonctionner ca :(
void CGomokuDisplay::InitBoard(int ac, char **av, int PosX, int PosY, int Height, int Width)
{
glutInit(&ac, av);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowSize(Height, Width);
glutInitWindowPosition(PosX, PosY);
glutCreateWindow(av[0]);
glutDisplayFunc(_Display);
}
void CGomokuDisplay::_Display()
{
/*Le code pour le display*/
}
La class :
class CGomokuDisplay
{
private:
void _Display(); // Fonction d'affichage principale
public:
CGomokuDisplay();
~CGomokuDisplay();
void InitBoard(int ac, char **av, int PosX, int PosY, int Height, int Width); // Initialise la fenetre openGL
};
Dans une class, une méthode public peut acceder à une méthode privée, mais pour faire un pointeur dessus ....
Merci de vos réponses
A voir également:
C++ OpenGL => Comment fait-on un pointeur sur méthode ?
int MaClasse::sous(int a, int b)
{
return a - b;
}
int main(int argc, char **argv)
{
//Methodes statiques : pas d'allocation
int n = MaClasse::add(1, 2);
MaClasse::afficher(n); //Affichera 3
//Methodes normales dans la classe : allocation
MaClasse my = new MaClasse();
int n2 = my->sous(2, 1);
//Encore une methode statique
MaClasse::afficher(n2); //Affichera 1
return 0;
}
Pour en revenir à la question, OpenGL acceptera uniquement des méthodes statiques car il ne peut pas créer d'instance de ta classe et lui allouer de la mémoire. Il faut donc lui donner comme methode une methode statique.
J'espère que tu as compris, car c'est quand même les bases de la POO en C++ !
Phenix_ent
Messages postés5Date d'inscriptionmercredi 28 décembre 2005StatutMembreDernière intervention29 décembre 2005 28 déc. 2005 à 21:56
Ok, merci bien, maintenant ca fonctionne.
J'ai rendu la méthode display static et ca fonctionne.
class CGomokuDisplay
{
private:
static void _Display(); // Fonction d'affichage principale
public:
CGomokuDisplay();
~CGomokuDisplay();
void InitBoard(int ac, char **av, int PosX, int PosY, int Height, int Width); // Initialise la fenetre openGL
};
Une dernière question, je vois pas trop ce que ca change de rendre la méthode static (à part que ca fonctionne), vu qu'elle retour void ...
Peux-tu m'aider la dessus ?
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 29 déc. 2005 à 10:12
Il faut la rendre statique, comme ça, OpenGL ne doit pas créer d'Instance de la classe pour y accèder(comme toi tu peut y accèder sans créer d'instance). Mais dans une méthode statique, tu ne peut pas utiliser les autres membres de la classe si ils ne sont pas statiques.
Phenix_ent
Messages postés5Date d'inscriptionmercredi 28 décembre 2005StatutMembreDernière intervention29 décembre 2005 29 déc. 2005 à 10:20
Donc si je veux appeler une autre méthode de ma class dans "display", je devrais également la rendre static ?
Mais ce que je comprends pas bien, c'est ce que ca change de rendre une méthode static ou non, surtout quand elle renvoie void (mais bon, je pige pas non plus si c'était un int)
Phenix_ent
Messages postés5Date d'inscriptionmercredi 28 décembre 2005StatutMembreDernière intervention29 décembre 2005 29 déc. 2005 à 12:00
Ok, oui c'est bon, j'ai compris (enfin je pense).
Donc, une methode static peut etre considérée comme une fonction hors d'un objet (en terme d'appel), sauf si elle est privée.
Ce qui me manquait pour comprendre, c'est que j'avais pas pensé à allocation de la mémoire pour l'objet (ce qui effectivement pour opengl ne peut pas marcher).
int main()
{
PtrFunc::Initialize();
PtrFunc::_instance1.CallPtr();
PtrFunc::_instance2.CallPtr();
return 0;
}
Passez au debugger dans la methode initialize les pointeurs de fonction des 2 instances pointent au même endroit !!!!!
Executer... "l'appel n'est pas inversé".... i.e.: on a bien _int==1 puis _int==2....
Ce qui veut dire que c'est la même fonction qui est appelée mais dans un contexte différent -> l'instance en fait...