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 :

C++/CLI Wrapping et héritage


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut C++/CLI Wrapping et héritage
    Bonjour,

    Je suis en train d'implémenter une lib C++/CLI qui wrappe une autre lib C++, pour que les données soient accessible depuis C#.

    Jusqu'à présent je n'ai pas eu de problème à implémenter, mais j'arrive sur un pan glissant de la manip.

    En effet, du côté lib C++, j'ai du polymorphisme.

    J'ai fais en sorte de retrouver ce polymorphisme en C++/CLI dans les wrappers, pas de problème :

    Le problème se situe dans le passage du C++ au C++/CLI.
    J'ai un algo qui renvoie une liste de UA*, et ceux-ci doivent se retrouver sous forme de liste de A^ dans la lib CLI. Mais UA (et A) sont des classes abstraites. Il faut donc utiliser les classes concrètes pour wrapper.

    Problème, comment savoir ? Je pense passer par une factory, qui prend en entrée un UA* et rend en sortie un A^. Mais comment cette factory peut savoir sur l'objet o est de type UB* ou UC* ?

    Merci pour toute aide sur ce problème, pour lequel je n'ai rien trouvé sur le net (au sens web, pas .net )

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    Points : 149
    Points
    149
    Par défaut
    Bonjour,

    Je ne suis pas sur que cette idée vaille grand chose mais je me lance :

    • UB inclut une constante iu static int égale à 0.


    • UA inclut une constante iu static int égale à 1.

    Le test de cette constante pourrait permettre de différencier les deux types d'objets d'origine lorqu'ils sont "devenus" des A^ ?

    A+,
    A.
    Un ordinateur fait au bas mot 1 million d'opérations à la seconde, mais il n'a que ça à penser, aussi. (brèves de comptoirs, JM.Gourio)


  3. #3
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Il semblerait qu'on soit dans un cas de down_cast nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    convertir(UA *p_ua)
    {
       if(dynamic_cast<UB*>(p_ua)){
            // -> B
       }
       else
       if(dynamic_cast<UC*>(p_ua)){
            // -> C
       }
       // erreur
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    C'était plus ou moins ce que j'ai fait, mais je pensais qu'il y aurait peut être plus élégant que le dynamic_cast.
    Si je prends le temps, je pense mettre en place une méthode virtuel dans les UA qui renvoit un identifiant, lequel permet à la factory de prendre le bon wrapper dans une map. C'est moins rigide.

    Merci pour vos réponses

  5. #5
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Predicator Voir le message
    C'était plus ou moins ce que j'ai fait, mais je pensais qu'il y aurait peut être plus élégant que le dynamic_cast.
    Si je prends le temps, je pense mettre en place une méthode virtuel dans les UA qui renvoit un identifiant, lequel permet à la factory de prendre le bon wrapper dans une map. C'est moins rigide.

    Merci pour vos réponses
    Salut,
    Je n'avais pas proposé de mettre une méthode virtuelle dans UA car je pensais que tu ne pouvais y toucher : classe d'une bibliothèque et/ou volonté de rester 100%C++. Auquel cas le wrapper doit faire cette conversion et déterminer le type dynamiquement.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    En fait, l'algo qui génère les données est en C++, mais les données doivent être accessibles depuis C#. Dans mon cas, la lib de données C++ évolue en même temps que la lib des wrappers C++/CLI, donc je suis relativement libre dans ce qu'il est possible de faire...

  7. #7
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Predicator Voir le message
    En fait, l'algo qui génère les données est en C++, mais les données doivent être accessibles depuis C#. Dans mon cas, la lib de données C++ évolue en même temps que la lib des wrappers C++/CLI, donc je suis relativement libre dans ce qu'il est possible de faire...
    Néanmoins, j'hésiterais à mettre dans UA la méthode virtuelle qui génère le A. Car, ça revient à introduire dans la classe UA une partie du wrapper. C'est pour ça que je me demande si la conception la moins bancale n'est pas d'avoir une fabrique qui fait un downcast sur UA pour obtenir le type dynamique et construire le bon A en conséquence.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    Alors la méthode n'est pas là pour générer le wrapper. C'est vrai que ça ne servira qu'à ça, et que c'est "bancal" de ce point de vue, mais ça n'ajoute pas de dépendance. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string UA::getClass() {
       return "UA";
    }
    Puis dans A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    string class = ua->getClass();
    String^ mClass = gcnew String(class.c_str());
    // Récupère le nom de la classe wrapper en fonction du nom de la classe à wrapper
    String^ wrapperClass = getWrapper(mClass);
    System::Activator::CreateInstance(wrapperClass);
    ...
    Attention le code n'est pas valide hein, je l'ai écrit directement ici pour présenter le principe...

  9. #9
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Predicator Voir le message
    Alors la méthode n'est pas là pour générer le wrapper. C'est vrai que ça ne servira qu'à ça, et que c'est "bancal" de ce point de vue, mais ça n'ajoute pas de dépendance. Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string UA::getClass() {
       return "UA";
    }
    Puis dans A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    string class = ua->getClass();
    String^ mClass = gcnew String(class.c_str());
    // Récupère le nom de la classe wrapper en fonction du nom de la classe à wrapper
    String^ wrapperClass = getWrapper(mClass);
    System::Activator::CreateInstance(wrapperClass);
    ...
    Attention le code n'est pas valide hein, je l'ai écrit directement ici pour présenter le principe...
    Je comprend l'intention, mais je me demande si je ne préfère pas le downcast. En fait, getClass me fait penser à un downcast déguisé qui en plus vient polluer la classe.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    L'avantage est que potentiellement, tu n'as aucune maintenance de code à faire pour la factory. Elle peut prendre une map externalisée (un bête fichier) pour générer un wrapper dont elle n'a même pas connaissance...

  11. #11
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Ok, je vois. A ce moment, j'aurais peut être découpé en deux : un premier service qui te retourne une chaîne (en fait un identifiant unique) d'après le type dynamique de l'objet et ta fabrique paramétrée par ton fichier (en fonction de l'identifiant). Ca laisse tes classes C++ indépendantes du wrapping.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    C'est exactement ce que j'ai décris. Il manquait juste le fonctionnement de GetWrapperClass, mais ça me semblait évident.
    Enfin, c'est si j'ai le temps ^^
    Pour l'instant je me contente du dynamic cast...

  13. #13
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Si tu penses avoir ta réponse, pense au bouton

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Avril 2007
    Messages : 23
    Points : 48
    Points
    48
    Par défaut
    Oh, désolé je connais pas encore bien ^^

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

Discussions similaires

  1. [C++/CLI] Héritage et méthode Dispose()
    Par toopac dans le forum C++
    Réponses: 1
    Dernier message: 01/06/2010, 09h20
  2. Héritage multiple en C++/CLI: comment faire svp?
    Par Rodrigue dans le forum C++/CLI
    Réponses: 3
    Dernier message: 03/03/2008, 07h07
  3. utiliser les tag [MFC] [Win32] [.NET] [C++/CLI]
    Par hiko-seijuro dans le forum Visual C++
    Réponses: 8
    Dernier message: 08/06/2005, 15h57
  4. StringGrid, multiligne et word wrap
    Par Dajon dans le forum C++Builder
    Réponses: 7
    Dernier message: 17/09/2003, 17h15
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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