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 :

Référencer une classe par son nom sous forme de chaîne (reflexion ?)


Sujet :

C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Référencer une classe par son nom sous forme de chaîne (reflexion ?)
    Hello,

    Dans une fonction, je reçois sous forme de chaîne le nom d'une classe.

    Comment, muni de cette chaîne de caractère, puis-je référencer les membres de cette classe ?

    Je précise que cela doit également être compilable sous gcc...

    Merci.

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il n'y a pas moyen en C++ mais différentes techniques permettent de contourner le problème. Le choix dépend de ce que les classes ont en commun et du contexte.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Pour le contexte, c'est simple : une fonction reçoit en paramètre le nom d'une classe, et elle appelle une autre fonction ayant en paramètre des accès à cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fonction_A("nom de classe")
    {
       fonction_B(classe::pouet);
    }
    Les classes n'ont pas forcément grand chose en commun.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Tu peux te renseigner sur ce que fait CRuntimeClass(MFC), ou bien le pattern Factory tel qu'il est employé dans Tclcl...
    Par contre, selon le compilateur, il peut y avoir certains problèmes, comme ceux indiqués ici:
    http://www.developpez.net/forums/sho...d.php?t=222397

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ca me paraît aller trop loin, cette histoire... :-/

    Mais j'en profite pour retourner le problème : est-il possible, à partir d'une classe, de récupérer son nom sous forme de chaîne ?

    Et dans ce cas, comment passer en paramètre une référence à cette classe sans qu'il n'y ait d'instanciation, juste histoire de récupérer son nom sous forme de chaîne, ET d'appeler des méthodes statiques ?

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par oodini
    a- Mais j'en profite pour retourner le problème : est-il possible, à partir d'une classe, de récupérer son nom sous forme de chaîne ?

    b- Et dans ce cas, comment passer en paramètre une référence à cette classe sans qu'il n'y ait d'instanciation, juste histoire de récupérer son nom sous forme de chaîne, ET d'appeler des méthodes statiques ?
    a- non.
    Avec GCC, via les typeinfo, tu auras un nom de classe parasité par les infos de décorations nécessaires au link. Il te faudra faire appel à un demangleur.
    Il y a une lib avec GCC pour faire cela. Elle est bien cachée, mais elle existe.

    b- Il te te faut définir quelque chose d'équivalent dans le principe à une factory. En fait, si les createurs sont paramétrables (pour utiliser autre chose que "new T()"), il est même possible d'utiliser une factory générique.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    OK, merci pour ces infos pointues.

    Je crois que je vais renoncer à l'idée de factoriser, et me taper des redites dans mon code...

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    À ta question a), on peut répondre oui et non.
    Non de base, mais oui très facilement, en implémentant une RTTI (Run-Time Type Identification) de ton cru. C'est ce que fait MFC avec ses CRuntimeClass, et de ce coté-ci, il n'y a aucun problème, car depuis un objet, il est très facile d'avoir accès à sa CRuntimeClass (le problème évoqué plus haut se posait dès qu'une collection était nécessaire, par exemple pour récupérer la CRuntimeClass à partir d'une chaîne).

    Par contre, pour ton coup des méthodes statiques, j'ai bien peur que qu'il y ait une faille quelque part dans ta conception, puisqu'une méthode statique est par définition non-virtuelle, donc n'est pas supposée dépendre du type.
    Il te faudrait donc au minimum un pointeur vers une "interface"...

    Edit: Enfin, tu peux toujours associer à ta CRuntimeClass (ou ton équivalent) une série de pointeurs de fonctions pointant vers diverses méthodes statiques de la classe...
    C'est ce que fait IMPLEMENT_DYNCREATE() de MFC qui donne un pointeur vers la fonction CMaClasse::Create() qui appelle le constructeur...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Citation Envoyé par oodini
    Mais j'en profite pour retourner le problème : est-il possible, à partir d'une classe, de récupérer son nom sous forme de chaîne ?
    Voici un bout de code qui fait du demangling sous gcc, et qui utilise directement typeid pour les autres.

    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
     
    #if __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ > 0 )
    #define GCC_USEDEMANGLE
    #endif
     
    #ifdef GCC_USEDEMANGLE
    #include <cstdlib>
    #include <cxxabi.h>
    #endif 
     
     
    #ifdef GCC_USEDEMANGLE
      char const * mangledName = typeid(*this).name();
      int status;
      char* unmangled = abi::__cxa_demangle(mangledName, 0, 0, &status);
      if(status == 0)
        {
        // unmangled contient le nom non décoré, ne pas oublier de libérer la mémoire
        free(unmangled);
        }
      else
        {
        // il y a eu un problème, on doit utiliser mangledName
        }
    #else
      // pas sous GCC, on utilise directement typeid(*this).name()
    #endif

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/06/2012, 01h09
  2. Réponses: 5
    Dernier message: 31/05/2012, 16h00
  3. Réponses: 17
    Dernier message: 08/12/2008, 12h01
  4. Retrouver une instance de classe par son nom
    Par chipster45 dans le forum Langage
    Réponses: 15
    Dernier message: 10/03/2008, 19h26
  5. Réponses: 3
    Dernier message: 25/02/2007, 18h49

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