IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Passage d'une classe en argument a glut


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut Passage d'une classe en argument a glut
    Hello,

    Je bloque devant la chose suivante :

    Je souhaite basculer ma librairie C GLUT/OPENGL en version objet avec C++

    Du coup j'essai de faire la chose suivante :

    class A
    {
    ...
    void affiche() ;
    }

    main()
    {
    ...
    A * a = new A () ;
    glutDisplayFunc(a->affiche);
    ...
    }

    mais ca ne fonctionna pas.
    Comment faire pour passer un methode membre a un pointeur de fonction ?

    Merci

    EDIT :
    l'erreure est la suivante :
    ERROR : argument of type "void (A: ()" does not match "void (*) ()"

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ce n'est pas possible directement, une fonction membre n'est pas une fonction libre, elle n'a pas la même signature, comme l'indique le message d'erreur.

    Il faut passer par une fonction libre intermédiaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    static A theA;
     
    extern "C" void affiche(void)
    {
       theA.affiche();
    }
     
    glutDisplayFunc(affiche);

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Merci du coup de main.
    Je viens de comprendre pourquoi on pouvait pas
    J'ai legerement modifier ton idée pour permettre l'heritage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class A
    {
        static void AFFICHE ()
        {
            Affichage * Aff ;
            return Aff->Affiche();
        }
     
        void Affiche ()
        {
    ...
        }
    }
     
    main()
    {
    ...
     A * a = new A () ;
     glutDisplayFunc(a->AFFICHE);
    ...
    }
    Ainsi ca marche impec et je peut heriter de A pour adapter Affiche ()

    MERCI

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Autant pour moi je ne peut pas mettre en jeu l'heritage.

    Il va me falloir trouver une autre solution

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Il reste possible d'avoir un comportement polymorphique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class A {virtual void affiche();};
    class B : public A {virtual void affiche();};
     
    static A* theA;
     
    extern "C" void affiche(void)
    {
       theA->affiche();
    }
     
    int main()
    {
      B b;
      theA = &b;
      glutDisplayFunc(affiche);
    }
    C'est juste que comme la fonction glutDisplayFunc n'accepte qu'un paramètre, il faut passer par une variable globale (ou statique) pour passer l'adresse de l'objet.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 57
    Points : 41
    Points
    41
    Par défaut
    Merci Sylvain.Togni

    En effet ta methode me permet de derivé ma classe d'Affichage afin d'avoir plusieurs contextes et ainsi le changer a la volé.

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage d'une structure en argument de classe
    Par so.generously dans le forum Langage
    Réponses: 3
    Dernier message: 27/05/2009, 10h07
  2. passage d'une methode avec argument
    Par skanderb dans le forum JSF
    Réponses: 27
    Dernier message: 27/04/2007, 17h36
  3. Passage d'une String[] en argument.
    Par Empty_body dans le forum Langage
    Réponses: 3
    Dernier message: 08/03/2007, 14h41
  4. [C#] Passage d'une méthode en argument
    Par Husqvarna dans le forum C#
    Réponses: 8
    Dernier message: 15/11/2006, 12h54
  5. passage d'une classe à une autre
    Par Gibou dans le forum C++
    Réponses: 17
    Dernier message: 18/06/2006, 15h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo