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

Langage C++ Discussion :

Polymorphisme et pointeur de fonction


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Par défaut Polymorphisme et pointeur de fonction
    Bonjour à tous !

    Je tente, tant bien que mal, de passer une méthode de classe en argument à une autre (callback) ...

    Voici le code simplifié :

    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
    23
     
    #include "icontroler.h"
    #include "view.h"
     
    class Controler : public IControler
    {
    private:
    	View view;
     
    public:
    	Controler()
    	{
    		view.listenQuit(this, &Controler::on_quit);
    	}
     
    	virtual ~Controler();
     
    	void on_quit()
    	{
    		view.hide();
    		return;
    	}
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include "icontroler.h"
     
    class View
    {
    public:
    	View();
    	virtual ~View();
     
    	void listenQuit(IControler* inst, void (IControler::*on_func)())
    	{
    		quit_file_menu.signal_activate().connect(sigc::mem_fun(inst, on_func));
    	}
    };
    Mon but est de passer la fonction on_quit de Controler en argument à la fonction listenQuit() de View.

    Or la classe View ne doit pas savoir de quel classe provient la fonction : pour cela j'ai utilisé une classe abstraite IControler car il peut y avoir plein de classe comme View.



    Or mingW me sort l'erreur :

    no matching function for call to View::listenQuit(Controler* const, void (Controler::*)())'

    sur la ligne :

    view.listenQuit(this, &Controler::on_quit);



    Y a-t-il une astuce pour faire cela ???


    Merci

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    view.listenQuit(this, &IControler::on_quit);
    void (Controler::*)(void) et void (IControler::*)(void) sont 2 types différents.

    La résolution est bien dynamique même si le pointeur de fonction est sur la classe de base (à condition de l'appeler sur un pointeur ou une référence). Cf Qu'est-ce qu'un pointeur de fonction virtuelle ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Par défaut
    Merci de ta réponse !

    Je vais creuser ça ...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Par défaut
    Ca marche !!! mais à condition de déclarer on_quit() dans IControler ...

    Merci

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Ernesto_X Voir le message
    Ca marche !!! mais à condition de déclarer on_quit() dans IControler ...

    Merci
    Qu'entends tu par déclarer ? Comme fonction virtuelle pure suffit. Il n'est pas besoin de la définir dans IControler.
    Remarque, que c'est ce que je pensais que tu avais fait : déclarer on_quit dans IControler comme fonction virtuelle pure et la définit dans la classe concrète Controler

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

Discussions similaires

  1. opengl et pointeur de fonction
    Par Oldhar dans le forum C
    Réponses: 5
    Dernier message: 06/11/2003, 23h56
  2. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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