Problème classe et main : argument does not match

RS8
Messages postés
100
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
15 juillet 2009
- 13 juil. 2009 à 14:49
RS8
Messages postés
100
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
15 juillet 2009
- 15 juil. 2009 à 15:19
Bonjour,

je fais actuellement de 'lOpenGL.
Je voudrais avoir deux fichiers : drawing.cpp et main.cpp

Dans le main.cpp il n'y a que le main et dans drawing.cpp il y a toutes les fonctions nécessaires à l'affichage en OpenGL (init(), display(), reshape(), ...)

Je crée un objet drawing dans le main et j'appelle mes fonctions initt(), display(), ...

Mais le problème est que lorsque dans le main je fais GlutDisplayFunc(display) et GlutReshapeFunc(reshape) j'ai le message d'erreur suivant :
erreur : argument of type 'void (Drawing::) (int, int)' does not match 'void (*) 'int, int)' et apreil pour le glutReshapeFunc.R

Que dois-je changer pour que cela fonctionne ?

Je joins le drawing.h ainsi que le main :

Fichier drawing.h :

class Drawing {
    public:
       Drawing(int a, int b);
       void init();
       void reshape(int w, int h);
       void display();
};

Fichier main:

int main() {
     Drawing d(3, 3);
     d.init();
     glutDisplayFunc(d.display);
     glutReshapeFunc(d.reshape);
     glutMainLoop();
     return 0;
}

Merci.
A voir également:

6 réponses

cs_Lucky92
Messages postés
180
Date d'inscription
mercredi 22 décembre 2004
Statut
Membre
Dernière intervention
16 août 2012
2
13 juil. 2009 à 15:49
Salut,

On ne peut pas utiliser des méthodes d'objets comme pointeurs de fonction.
Il faut utiliser soit des méthodes de classe ( méthodes statiques ), soit des foncteurs ( objet-fonctions ).
0
RS8
Messages postés
100
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
15 juillet 2009

13 juil. 2009 à 16:13
Ok mais le problème c'est que dans display j'appelle d'autres méthodes et celles-ci ne peuvent pas être statiques ! Donc je ne peux pas mettre display en statique.

Et avec les foncteurs ça donnerait quoi en gros ?

Merci.
0
cs_juju12
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
13 juil. 2009 à 18:39
tu peux créer une fonction display statique qui appellera la fonction display de l'objet, mais il faudra stocker quelque part l'identité de l'instance de classe avec laquelle on travaille. Par exemple :

class Drawing
{
protected:
static Drawing* pCurrentObject;
void display();
public:
static void com_display() {pCurrentObject->display();}
void SetCurrentObject(Drawing*pObject) {pCurrentObject=pObject;}
};

int main(void)
{
Drawing D(3,3);
Drawing::SetCurrentObject(&D);
glutDisplayFunc(D::com_display);
// ...
}

tu peux éventuellement appeler SetCurrentObject() dans le constructeur même de Drawing pour ne pas avoir à le faire dans le code, sauf en cas de changement d'objet.
0
RS8
Messages postés
100
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
15 juillet 2009

13 juil. 2009 à 18:45
Ok merci, je vais essayer ça!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
RS8
Messages postés
100
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
15 juillet 2009

15 juil. 2009 à 15:14
Merci beaucoup ça marche.

J'ai juste du rajouter quelques lignes mais l'idée était là. :)
0
RS8
Messages postés
100
Date d'inscription
vendredi 18 mai 2007
Statut
Membre
Dernière intervention
15 juillet 2009

15 juil. 2009 à 15:19
Merci beaucoup ça marche.

J'ai juste du rajouter quelques lignes mais l'idée était là. :)
0