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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 éprouvé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 126
    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.

  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
    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 averti
    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
    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
    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 averti
    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
    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...

+ 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