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 éprouvé
    Inscrit en
    Juin 2007
    Messages
    89
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    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 confirmé

    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
    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 expérimenté
    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
    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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    boost::function couplé à boost::bind.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 89
    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
    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