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 :

Transtypage via static_cast, au secours !


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut Transtypage via static_cast, au secours !
    Bonjour à tous.
    Dans le cadre d’un problème d’intégration à un ensemble applicatif préexistant je suis confronté au problème suivant de réécriture d’un constructeur de copie :

    Je travaille sur une classe A et sur une classe B, avec l’indication que B est une classe virtuelle pure que j’instancie via une classe template. J’ai donc indicativement:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Class B //une classe virtuelle
    {
    protected:
    //variables
    public:
    virtual  Void do_work()=0;
    };
     
    Template <typename  implémentation "utile" de la classe
    Class VeryB: public B
    {
    public:
    VeryB() //constructeur par défaut
    {}
     VeryB(_variables)
     {
     //affectations diverses
     }
     };
     
     class WorkingB: public VeryB<WorkingB>
     {
     WorkingB() //le constructeur vide
    {}
     WorkingB(_variables)
     :VeryB<WorkingB>(_variables)
     {
     //affectations diverses
     }
     void do_work()
     {
     return;
     //un traitement
     }
     
     //recopie  
    WorkingB(_variables)
     };
    J'ai maintenant ma classe de mise en œuvre :
    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
    20
    21
    22
     class A()
     {
     private:
     //des variables
     //et :
     B* bObj;//A opèrera notamment sur un représentant de B
     public:
     A() //le constructeur vide
     {}
     A(paramètres)
     {
     bObj=new WorkingB(paramètres); //construction de la bonne instance (spécialisation) de B
     //etc
     }
     //ET MON PROBLEME, AU NIVAU DE LA RECOPIE;
     A(const &objToCopy)
     {
     //différentes recopies icis, mais pour le cas du pointeur sur classe abstraite B?
     //si B avait été une classe standard, j'aurais fait :
     bObj=new B(*objtocopy));
     }
     } ;
    Je pensais faire une chose du genre (mais je sais que c’est faux écrit comme ça, c’est juste pour donner l’esprit):
    bObj=new static_cast<VeryB>VeryB(*objtocopy>));

    L’idée c’est donc que quand j’appelle le constructeur de copie de A, il retrouve le type de la classe implémentée pour B et qu’il me construise bObj à l’aide du pointeur sur le bon constructeur.

    Est-ce que je suis sur une voie, voyez-vous une solution?
    Merci

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    Bonjour.

    si je peux me permettre une remarque, c'est bien de simplifier les classe et de réécrire des exemple propre, mais ce serait bien de relire, il y a plein de truc bizarres, même si on peut deviner quoi.

    Concernant ta question, je ne vois pas pourquois tu veux caster. je te conseille de lire: Pourquoi l'utilisation du downcasting est une pratique à éviter ainsi que la page de la faq associée.

    Pour ma part, il me semble que si workingB a un constructeur à partir de B, il n'est pas nécessaire de faire un quelconque cast: puisque B ne peut être instancié, ce sera workingB qui le sera. reste le problème des appels de méthodes de workingB il faut bien s'assurer que toutes les méthodes communes à B et surchargées par workingB qui seront appelées sont virtuelles afin que ce soient bien celles de workingB et non celles de B qui soient appelées.(le cas échéant, il sera peut-être nécéssaire de reconsidérer un dynamic_cast mais mieux vaudra revoir la conception).

    Bonne chance.

  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,
    Souvent, héritage == sémantique d'entité == sémantique de copie : non copiable.
    Cependant, pour répondre à ta question, il existe de DP clone :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class base
    {
    public:
    virtual base *clone()=0;
    };
    class derivee : public base
    {
    public:
    virtual derivee*clone(){return new derivee(....);
    };

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    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 381
    Points : 41 582
    Points
    41 582
    Par défaut
    (note: DP signifie Design Pattern)

    De plus, l'exemple de 3DArchi montre les retours covariants

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 31
    Points : 13
    Points
    13
    Par défaut
    Salut, alors méphistopheles pour répondre à ton interrogation, si je pose la question c'est peut-être que je n'ai simplement pas d'idée, au départ de comment il faut faire et que simplistement, j'essaie de dire ce que je cherche à faire avec les éléments qui me viennent?...

    Bien le merci, 3DArchi pour ta réponse et à toi Médinoc pour le nota: clair que je n'aurais pas pensé à une signification pour "dp", et donc, je vais essayer ça! Merci encore!

Discussions similaires

  1. AU SECOURS XML AFFICHER IMAGES VIA UN NUMERO ASP
    Par rebecca007 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 14/04/2009, 15h46
  2. [Transtypage] encore une erreur static_cast
    Par camboui dans le forum C++
    Réponses: 13
    Dernier message: 02/12/2008, 14h33
  3. [Kylix] PostgreSql via ODBC
    Par doykati dans le forum EDI
    Réponses: 3
    Dernier message: 08/02/2007, 10h10
  4. [TP7] Calculer sin, cos, tan, sqrt via le FPU
    Par zdra dans le forum Assembleur
    Réponses: 8
    Dernier message: 25/11/2002, 04h09
  5. Réponses: 4
    Dernier message: 05/06/2002, 12h15

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