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 :

Pointeur sur fonction de classe anonyme


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Points : 99
    Points
    99
    Par défaut Pointeur sur fonction de classe anonyme
    Bonjour j'essaye d'obtenir un pointeur sur une fonction de plusieurs classes :

    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
     
    class A {
      void cb();
    }
     
    class B {
     void cb();
    }
     
     
    int main()
    {
      void (*f ());
     
      a = new A();
      b = new B();
     
     
      f = &A::cb;
      f = &B::cb;
    }
    Malheureusement pour pouvoir pointer sur une fonction membre je suis obligé de spécialiser mon pointeur :
    Y'a t'il un moyen d'anonymiser ce pointeur?

    du genre


  2. #2
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    C'est tout l'interêt du polymorphisme...
    Il suffit de passer par une interface:

    Code c++ : 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
     
    interface Base {
       virtual void cb() = 0;
    }
     
    class A : public Base {
      void cb();
    }
     
    class B : public Base  {
     void cb();
    }
     
    int main()
    {
      void (Base::*f ()); 
     
      // les new sont inutiles....
     
      f = &A::cb;
      f = &B::cb;
    }

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Points : 219
    Points
    219
    Par défaut
    Citation Envoyé par nicroman Voir le message
    C'est tout l'interêt du polymorphisme...
    Il suffit de passer par une interface:

    Code c++ : 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
     
    interface Base {
       virtual void cb() = 0;
    }
     
    class A : public Base {
      void cb();
    }
     
    class B : public Base  {
     void cb();
    }
     
    int main()
    {
      void (Base::*f ()); 
     
      // les new sont inutiles....
     
      f = &A::cb;
      f = &B::cb;
    }
    Ton code ne compile pas. Es-tu sûr qu'il est possible d'assigner un pointeur sur fonction membre d'une classe dérivée à un pointeur sur une fonction membre d'une classe de base ?

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    boost::function couplé à boost::bind.

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    Points : 99
    Points
    99
    Par défaut
    C'est tout l'interêt du polymorphisme...
    Dans mon cas je veux être capable d'appeler n'importe que méthode de n'importe quel objet. L'es objets ayant des responsabilités fort différente.

    boost::function couplé à boost::bind.
    Effectivement, je lorgnait un peu sur boost, mais cela m'embête de dépendre de cette bibliothèque juste pour ce besoin là!

    Y'a t'il une autre méthode?

  6. #6
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Solution héritage:
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class Base
    {
    public:
    	virtual int F(){return 0;}
    };
    class A :public Base
    {
    public:
    	virtual int F(){return 1;}
    };
    class B :public Base
    {
    public:
    	virtual int F(){return 2;}
    };
     
    int main(int argc, _TCHAR* argv[])
    {
    	A L_a;
    	B L_b;
    	Base L_base;
    	Base *L_pBase;
    	int (Base::*L_pf)();
    	L_pf = &Base::F;
    	int L_i;
     
    	L_pBase = &L_base;
    	L_i = (L_pBase->* L_pf)();
    	L_i = (L_base.*L_pf)();
     
    	L_pBase = &L_a;
    	L_i = (L_pBase->* L_pf)();
    	L_i = (L_a.*L_pf)();
     
    	L_pBase = &L_b;
    	L_i = (L_pBase->* L_pf)();
    	L_i = (L_b.*L_pf)();
     
    	return 0;
    }
    ce code compile et fonctionne sous VC++ et gcc.

Discussions similaires

  1. mélange de pointeurs sur fonctions et classes
    Par membreComplexe12 dans le forum C++
    Réponses: 4
    Dernier message: 15/10/2012, 14h06
  2. [Win32] Pointeur sur fonctions et méthodes de classe
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2007, 19h07
  3. Réponses: 12
    Dernier message: 30/06/2006, 16h46
  4. Glut / Class / Pointeur sur fonction
    Par areS. dans le forum GLUT
    Réponses: 5
    Dernier message: 02/12/2005, 20h50
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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