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 :

Comment obtenir dynamiquement le nom d'une classe ?


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Par défaut Comment obtenir dynamiquement le nom d'une classe ?
    Bonjour à tous,

    Est-il possible d'obtenir le nom d'une classe par une variable contextuelle à l'image de __LINE__ (ou autre méthode) ?

    Pour illustrer mon besoin, voici un bout de code
    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 MaClasse {
      public:
        MaClasse();
        ~MaClasse();
     
        void* operator new(size_t Taille) {
          printf("Allocation [%d] pour <%s>\n",Taille,__CLASSNAME__);
          return (malloc(Taille));
        };
     
        void operator delete(void* Handle) {
          printf("Liberation <%x> pur <%s>\n",Handle,__CLASSNAME__);
          free(Handle);
        };
    }
    L'objectif est de faire profiter les classes héritant de "MaClasse" et permettre de superviser les new et delete sur ces dernières ...

    Par avance merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce dépend du compilo. A ma connaissance certains définissent une macro pour connaître la fonction courante, mais pas la classe.

    Par ailleurs, tes surcharges de new et delete devraient être statiques.

  3. #3
    Membre confirmé
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ce dépend du compilo.
    Mon compilateur est gcc... J'ai fait lecture du man gcc mais je ne trouve pas mon bonheur (ou je passe à côté de l'info )

    Merci encore pour ton aide

  4. #4
    Membre confirmé
    Homme Profil pro
    Intégrateur
    Inscrit en
    Novembre 2004
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Intégrateur
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Novembre 2004
    Messages : 139
    Par défaut
    Pour toute personne concernée, j'ai trouvé mon bonheur...

    La variable est la suivante : __PRETTY_FUNCTION__ sous gcc
    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
     
    extern "C" {
    extern int printf (char *, ...);
    }
    class a {
    public:
    void sub (int i)
    {
    printf ("__FUNCTION__ = %s\n", __FUNCTION__);
    printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__);
    }
    };
    int
    main (void)
    {
    a ax;
    ax.sub (0);
    return 0;
    }
    Le resultat est la suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    __FUNCTION__ = sub
    __PRETTY_FUNCTION__ = void a::sub(int)

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui, mais cela donne quoi dans le cas d'une fonction héritée, comme dans ton code initial ?

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Tu as des trucs propriétaires avec GCC:
    - backtrace te permet d'obtenir le contexte d'exécution ; il faut obligatoirement compiler avec -E, et penser à filtrer les fonctions utilitaires utilisées pour l'analyse dynamique du contexte courant
    - __cxx_abi::demangle (ou un nom comme cela) que tu devras utiliser sur les symbôles obtenus avec le backtrace (et auxquels tu auras supprimé ce qui dépasse à partir du signe '+') pour obtenir un nom lisible.

    Faire attention à la mémoire, on manipule des char* à gérer à la main. Cela vaut le coup de tout encapsuler (gestion des erreurs d'utilisation de ses fonctions) avec des std::string. Comme d'hab.

    Pas me demander le code, ne me balladant pas avec.


    Autre solution: un demangle appliqué sur le type exact des objets (-> typeid) que tu alloues. Ce qui va impliquer de ne jamais pouvoir passer par new/delete, mais de devoir utiliser une factory.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Comment rendre dynamique les noms des colonnes d'une vue
    Par patic dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/02/2009, 10h41
  2. Obtenir le nom d'une classe
    Par yapatchs dans le forum Langage
    Réponses: 10
    Dernier message: 26/09/2006, 11h37
  3. Création dynamique de méthode sur une classe ?
    Par elitost dans le forum Général Java
    Réponses: 9
    Dernier message: 18/10/2005, 14h47
  4. Comment changer dynamiquement la valeur d'une option de DbGrid ?
    Par Atrebate62 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 17/03/2005, 13h35
  5. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 13h40

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