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 :

introspection en c++


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut introspection en c++
    Bonjour,

    est-il possible en c++ de récupérer l'ensemble des attributs d'une classe, comme on pourrait le faire en java avec getFields() ? J'ai lu que apparemment non, que mis a part dynamic_cast et typeid, il n'y a pas grand chose d'autre pour faire de l'introspection. J'ai trouvé de la documentation a propos de Introspective C++ et de CAMP, mais je me demandais si c'etait pas utiliser un bazzoka pour écraser une mouche... Peut-être qu'il y a une méthode plus simple pour récupérer la liste des attributs ?

    J'en ai besoin pour gérer des classes qui sont crées dynamiquement, j'aimerai les stocker dans un cache, qui s'appelle memcached (écris pour du C) et qui ne peut que stocker des char*, en faisant bêtement une copie bit a bit des objets a stocker. Et avec des objets complexes en c++, il copie même les attributs qui sont des pointeurs sans se soucier du fait qu’on récupère plein IllegalAccess de mémoire lorsqu’après on tente d'aller chercher l'objet stocke dans le cache...
    Je vais essayer de réécrire quelques fonctions du cache pour stocker certains types d'objets avec lesquels je travaille, qui instances de classes générées dynamiquement (avec un nombre d'attributs pas forcement constant).

    merci de votre aide ^^

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    il n'y a aucune introspection possible, basiquement, en C++.
    Ce que tu présentes, ça ressemble à de la (de)serialisation, tu peux utiliser le polymorphisme pour rendre ça plus simple et meilleur.
    Avec les bonnes interfaces, ça se fait très bien.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Oh la, j'y connais pas grand chose en sérialisation ^^
    mais d'apres ce que j'ai lu, vu que les classes qui m'interessent sont générées automatiquement, je ne peux pas faire de sérialisation intrusive, et comme ces classes ne sont pas non plus entièrement publiques, je ne peux pas faire de sérialisation non intrusive... Apres je ne m'y connais pas d'avantage, peut-être qu'il y a d'autres techniques de sérialisation, mais ca ne me semble pas faisable ^^

    mais c'est possible de sérialiser un objet si je ne connais pas tout a fait ce qu'il y a dedans ?

  4. #4
    screetch
    Invité(e)
    Par défaut
    c'est un probleme presque insoluble... on te demande de serialiser des objets sans connaitre leur representation interne et sans y avoir acces. Alors quelques indices pour t'aider:

    - pour que ca marche, les objets ne doivent avoir ni constructeur de copie ni affectation. Pour "asserter" que ca marche, j'utilise une petite astuce: ces types sont les seuls types acceptes dans uneunion.

    Si un mec veut donc copier bit a bit sa classe, elle doit donc compiler si on la met dans une union.

    - un pointeur fait 4/8 octets (sur 64 bits) et est aligne sur 4/8 octets. Lors de la copie, je regarderais chaque 4/8 octets et si un objet a cette addresse a ete serialise il s'agit d'une reference vers un autre objet.


    Pour le reste ca tient de la magie bancale de copier bit a bit en C++, alors il faudrait soit assouplir les contraintes (on ne peut pas sauver n'importe quoi...) soit ajouter une introspectin propre.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Rhyos Voir le message
    mais c'est possible de sérialiser un objet si je ne connais pas tout a fait ce qu'il y a dedans ?
    J'ai eu mal à voir comment .
    Pour enregistrer/charger un entier, il te faut savoir que la classe possède un tel entier et de quel membre il s'agit.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par screetch Voir le message
    Pour le reste ca tient de la magie bancale de copier bit a bit en C++, alors il faudrait soit assouplir les contraintes (on ne peut pas sauver n'importe quoi...) soit ajouter une introspectin propre.
    je crois qu'il ne me reste en effet que les incantations vaudous pour m'en sortir ^^ Je vais donc voir si je peux utiliser CAMP ou une autre librairie pour faire de l’introspection, essayer de m'en sortir avec ça

    Pour enregistrer/charger un entier, il te faut savoir que la classe possède un tel entier et de quel membre il s'agit.
    Oui, c'est bien ça le problème... Comme tout est généré dynamiquement, je n'ai rien, pas de documentation, seulement un petit fichier de configuration ^^ mais bon on n'a pas toujours ce qu'on veut ^^

    merci a vous en tout cas

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    est-il possible en c++ de récupérer l'ensemble des attributs d'une classe, comme on pourrait le faire en java avec getFields() ?
    Pas sans déclarer ta classe avec une macro spéciale qui enregistre les différents champs pour qu'ils puissent être introspectés.

    Il y a des fonctionnalités prévues pour C++15 pour adapter n'importe quelle structure en tuple (qui est introspectable).
    Boost ftw

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

Discussions similaires

  1. [introspection][singleton] introspetion de classe à singleton
    Par Jaxofun dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 18/08/2005, 09h59
  2. [débutant(e)][Reflection] Introspection et creation de tableau
    Par Fladnag dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 04/07/2005, 15h59
  3. problème d'introspection sous eclipse
    Par rainz dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/05/2005, 16h33
  4. fonction de tri par introspection
    Par ned-flanders dans le forum C++
    Réponses: 7
    Dernier message: 21/10/2004, 11h49
  5. [JNDI] [LDAP] [DirContext] [LdapContext] DN / introspection
    Par wazup dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 09/04/2004, 15h16

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