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 :

Reflexion en C++


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut Reflexion en C++
    Bonjour,
    Y aurait il un truc en C++ qui me permet de faire la reflexion?? C'est a dire étant donné un objet o, et des NOMS de champs et méthodes en chaines de caracteres, Est ce qu'on peut appliquer ces methodes sur cet objet o et tirer aussi les valeurs des attributs donné en chaine de caractere de cet objet aussi??
    Plus precisement:
    j ai une classe point avec deux attribut x et y et une methode translater...
    j'ai les variables string suivantes:s1='x' et s2='y' et s3="translater". L'objet point étant créé p. Comment faire p.x et et p.y et p.translater????

    Je sais qu'en C# ca existe, mais j'en ai besoin de ça en C++... Merci d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Sans avoir plus regarder cela, il existe un projet OpenC++ qui permet de parser un code C++ et qui (A VERIFIER) pourrait eventuellement permettre d'automatiser des mecanismes de reflexion (creer de methodes automatiquement, qui par exemple prennent en parametre une chaine et modifie les c=valeurs)

    Sinon, tu peux eventuellement passer par un bind type (lua ou python) pour pouvoir appeler des methodes C++ a partir de chaines de caracteres ...

    Note : ces deux propositions sont loin d etre triviale (quoi qu'un bind lua ce fait rapidement avec tolua++) . bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    note : il n existe pas de methodes "builtin" pour faire de la reflexion en C++

  4. #4
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par smashy
    Sans avoir plus regarder cela, il existe un projet OpenC++ qui permet de parser un code C++ et qui (A VERIFIER) pourrait eventuellement permettre d'automatiser des mecanismes de reflexion (creer de methodes automatiquement, qui par exemple prennent en parametre une chaine et modifie les c=valeurs)
    Pourrais tu m'indiquer où puis je trouver ce pojet OpenC++ qui me permet de faire la reflexion

    Citation Envoyé par smashy
    Sinon, tu peux eventuellement passer par un bind type (lua ou python) pour pouvoir appeler des methodes C++ a partir de chaines de caracteres ...

    Note : ces deux propositions sont loin d etre triviale (quoi qu'un bind lua ce fait rapidement avec tolua++) . bon courage
    Sinon la deuxieme solution ca me fé peur car ca va me prendre surement un temps fous pour se familiariser avec le nouvo langage et d'installer l'environnement approprié et de pouvoir faire l'integration sacahant que j'ai pas trop le temps pour ce faire...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    si t'as bien declaré ta classe genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    classe point
    {
    private:
    int x;
    int y;
     
    public:
    point();
    point translater(-parametres de translater-);
    };
    dans le fichier "point.h"
    et dans le "point.cpp" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     point point::translater(-parametres de translater-){
     
    définition
    }
    lorsque dans le main(), tu declares genre
    point p;
    p.x= 4; p.y=58; point P4 = p.translater(x,y);

    ca doit marcher normalement

    ps : le "::" est appelé opérateur de résolution


  6. #6
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par marc_calagac
    si t'as bien declaré ta classe genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    classe point
    {
    private:
    int x;
    int y;
     
    public:
    point();
    point translater(-parametres de translater-);
    };
    dans le fichier "point.h"
    et dans le "point.cpp" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     point point::translater(-parametres de translater-){
     
    définition
    }
    lorsque dans le main(), tu declares genre
    point p;
    p.x= 4; p.y=58; point P4 = p.translater(x,y);

    ca doit marcher normalement

    ps : le "::" est appelé opérateur de résolution

    C'est que tu m'as pas bien compris... voila ce ke je veux: étant donné un string s, alors comment recupérer la valeur du champ de p indiqué par s, c'est a dire si s contient la valeur 'x' je doit avoir p.x, et si elle contient 'y' je veux p.y, autrement si s contient "translater" je veux appliquer la methode translater sur p etc....

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    http://www.codeproject.com/library/opencxx.asp

    sinon pour lua , c est un langage de script plutot simple, et il existe des programme (tolua++) pour automatiser la generation de code de bind.

    Il existe meme un livre (dont je n ai plus le nom sur moi) tres simple et peu epais pour apprendre a s en servir
    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 machin { // tolua_export
     
    public:
     
      // tolua_begin
     
      void f();
     
     // tolua_end
     
     
    private:
     
      int i
    }; // tolua_export

    tolua ++ va te permettre a partir d un header un peu modifie d accede dans lua a ton code C++

  8. #8
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Bonjour bouzaidi,

    je suis peut-être un peu fatigué, mais l'énoncé de ton problème ne me semble pas trés clair.

    Déjà, j'ai l'impression que tu te fourfoie sur la notion de réflexion de code. La réflexion de code consiste à récupérer des données (méta données) dans du code compilé. Je ne vois pas où est le code compilé dans ton problème.

    Ensuite, tu écris:
    étant donné un string s, alors comment recupérer la valeur du champ de p indiqué par s
    . si l'on admet que p est une instance de la classe Point, comment est définie cette classe Point?
    . quelle forme prend s?

    Pourrais-tu donner quelques précisions car là, je ne vois pas du tout ce que tu cherches à faire.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 22
    Points
    22
    Par défaut appeler une fonction a partir d'une chaine de caracteres
    Bonjour, je pense avoir la meme preoccupation;
    Si c'est le meme probleme, ca aidera peut etre a comprendre...

    Je recois un message en string ou en char*, je l'analyse pour en tirer un nom d'une fonction, et des eventuels parametres.
    Par exemple je recupère le nom function1 et le paramétre int 128.
    J'ai alors tout ce qu'il me faut pour appeler la fonction function1(128); mais il reste le problème que c'est une chaine de caractères. Donc je cherche quelque chose qui me permettra a partir de cette chaine a appeler une fonction (biensur predefinie)

    Je pense que ca rejoint la question de bouzaidi...
    Si qqn a une reponse a ce topic, ce serait d'une grande aide

  10. #10
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    OOOOh Xorgnem on est dans le meme train... C'est exactement ma problematique, je recupere depuis une BD un nom de methode function1 qui est bien sur en string ou en char*, ainsi ke les parametres mais comment l'appeler c'est ce qui me tue....
    J'espere ke là c est bien expliké làà

  11. #11
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Je comprends mieux le problème.
    A mon humble avis, étant donné que vous connaissez à l'avance quelles sont les fonctions qui sont susceptibles d'être appelé (n'est-ce pas?) une simple map de pointeurs de fontions (indexé par leurs noms) devrait suffire.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  12. #12
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    Citation Envoyé par r0d
    Je comprends mieux le problème.
    A mon humble avis, étant donné que vous connaissez à l'avance quelles sont les fonctions qui sont susceptibles d'être appelé (n'est-ce pas?) une simple map de pointeurs de fontions (indexé par leurs noms) devrait suffire.
    En ce qui me concerne j'ai plein de fonctions qui sont suceptibles d'etre appelées, et je ne peux etudier tous les cas possible (c'est possible mais c'est couteux je crois)... c'est pour ca que j'aimerais bien pouvoir n'importe quelle fonction a partir de son nom.

    J'ai entendu parler de RTTI!!!!! mais j'en connais pas trop, snon r0d tu peux me preciser le truc de map que t'as proposé. Merci par avance

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème n'est pas seulement de connaître les fonctions, il faut également savoir comment les appeler: Si elles n'ont pas toutes le même prototype, ça ne sera pas évident de les appeler...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Pour ce qui est de mon probleme, a l'heure actuelle, je ne connais pas les fonctions qui seront implementees et c'est pas moi qui vais le faire. (et elles sont peut être nombreuses)
    Ca me parait difficile, mais je reste interessé par une petite explication de comment on fait, au cas ou que ca suffirait, si je mets d'accord avec ceux qui bossent sur les fonctions à implementer.
    Merci!

    Le but du projet est d'envoyer des messages string totalement generiques par ethernet sur un systeme embarqué (sous win CE) pour executer des fonctions et ainsi les tester.

  15. #15
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Médinoc
    Le problème n'est pas seulement de connaître les fonctions, il faut également savoir comment les appeler: Si elles n'ont pas toutes le même prototype, ça ne sera pas évident de les appeler...
    Exact, je n'avais pas pensé à ça. Et si, de plus, le nombre de fonction est important, mon idée de map de pointeurs de fonction tombe à l'eau.

    Non, ce n'est pas simple, je ne sais pas trop comment faire
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  16. #16
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Xorgnem
    Pour ce qui est de mon probleme, a l'heure actuelle, je ne connais pas les fonctions qui seront implementees et c'est pas moi qui vais le faire. (et elles sont peut être nombreuses)
    Ca me parait difficile, mais je reste interessé par une petite explication de comment on fait, au cas ou que ca suffirait, si je mets d'accord avec ceux qui bossent sur les fonctions à implementer.
    Merci!

    Le but du projet est d'envoyer des messages string totalement generiques par ethernet sur un systeme embarqué (sous win CE) pour executer des fonctions et ainsi les tester.
    Pour un truc comme ça, je pense que gSoap devrait convenir.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  17. #17
    Membre du Club
    Inscrit en
    Avril 2007
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 187
    Points : 55
    Points
    55
    Par défaut
    C'est vrai, il y a le problème de signature des methodes qui pourront etre differentes d'un appel à autre(et meme pire, une meme methode qui est surchargé deux fois on connait pas trop laquelle des deux fonction on doit utiliser)... Mais rappeler vous bien que j'ai déjà mentionné que je vais filer les parametres aussi en tant que chaine de caractere, et non seulement le nom des fonctions...

    sinon si on prend le cas le plus simple où les methodes a appeler n'ont pas de parametre, comment on va faire alors??

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Donc, ce que tu cherches à faire, c'est de la conversion d'appel ?
    Créer un appel de toutes pièces à partir de données extérieures, et les appeler ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #19
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2007
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par r0d
    Pour un truc comme ça, je pense que gSoap devrait convenir.
    Mais si j'ai bien compris gSoap est un logiciel mac...
    Moi je dois ameliorer tout un systeme de test de matos deja existant. Il me faut donc une fonction C++ a ajouter au monstre existant

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Xorgnem, bouzaidi : Vous êtes la même personne ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49
  2. [débat] Reflexion sur « quel langage ?»
    Par jack69 dans le forum Langages de programmation
    Réponses: 8
    Dernier message: 23/05/2005, 08h30

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