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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 31
    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 Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    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
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    (note: DP signifie Design Pattern)

    De plus, l'exemple de 3DArchi montre les retours covariants
    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.

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 31
    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