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

Visual C++ Discussion :

[héritage] Problème de cast


Sujet :

Visual C++

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut [héritage] Problème de cast
    Salut tout le monde,

    J'ai un problème en ce qui concerne l'héritage. J'ai une classe mère CServer et une classe fille CBackup et j'ai besoin de convertir CServer en CBackup.
    Est ce possible?


    Merci d'avance.

  2. #2
    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
    Que veux-tu dire EXACTEMENT par "convertir CServer en CBackup" ?
    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.

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    En fait, j'ai une troisième classe (COther) qui contient la classe CServer. La classe COther contier une fonction qui selon le type du serveur (Master ou backup) doit pouvoir accèder aux membres de la classe CServer et de la classe CBackup.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Class COther
    {
    public:
    CServer Server;
    int ServerType;
    public:
    COther(CServer *server);
    int MyFunction();
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int COther::MyFunction()
    {
    if(ServerType == 1)
    {
    //Some code
    }
    else
    {
    //Ici je dois pouvoir accèder à des membres de la classe fille
    }
    }

    Comment puis je faire cela?

  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
    Si tu es sûr de ton coup, un simple static_cast< CBackup * >(Server) suffit.
    Sinon, tu peux utiliser un dynamic_cast et vérifier que le pointeur retourné n'est pas NULL.


    PS: Cela ressemble fort à une erreur de conception. Pourquoi ne pas utiliser une fonction membre virtuelle dans CServer et CBackup ?
    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 confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Je vais essayer la méthode que tu as proposé.

    En fait, je peux éliminer la troisième classe, elle présente d'autres fonctionnaliés et c'est tout une autre histoire.

  6. #6
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    ça marche, merci.
    Tu pourrais m'expliquer, c quoi au juste cette commande?

  7. #7
    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
    Pour ça, je me vois obligé de te dire de relire ton cours de C++ : Les opérateurs de forcage de type font partie du langage lui-même.

    Ce que je peux dire, c'est qu'il y en a des plus permissifs que d'autres, notamment pour convertir un pointeur en un autre.
    • Le cast de type C ("C-Style cast") et son extension C++ ("Function-Style cast") sont les plus permissifs: ils permettent de convertir tout en n'importe quoi : Flottant en entier, entier en pointeur, pointeur d'un type à l'autre, pointeur const en non-const, etc.
    • Le static_cast est le moins permissif: Il permet de convertir les types d'entiers entre eux, il peut convertir un void* en (n'importe quel type)*, ou un CBase* en CDerivee * (la conversion dans l'autre sens étant implicite et n'ayant donc pas besoin de cast). On ne peut PAS convertir un pointeur const en pointeur non-const.
    • Le dynamic_cast ne peut (ou ne doit) s'utiliser que sur des pointeurs d'objets: Il sert justement à convertir un CBase* en CDerivee* (ou d'autres conversions du même tonneau) mais retourne un pointeur NULL si l'objet pointé n'est pas du bon type. C'est un peu plus lent qu'un static_cast, par contre.
    • Le reinterpret_cast est plus permissif que le static_cast, je crois qu'il permet toutes les conversions SAUF pointeur const en pointeur non-const.
    • Le const_cast permet de convertir un pointeur const en pointeur non-const. Son utilisation doit rester exceptionnelle, surtout pour un débutant.


    Pour éviter les erreurs, on utilise les opérateurs les moins permissifs possibles. Quand on programme en C++, le cast de type C est à bannir.
    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.

  8. #8
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 212
    Par défaut
    Je me rappelle avoir lu ça quelque part merci bcp

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 04/01/2007, 11h43
  2. [JDBC Driver][JSTL] Problème de cast de données
    Par GyLes dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/09/2005, 10h00
  3. problème de cast!
    Par LaseLiep dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2005, 09h30
  4. Problème de cast/serialization/externalization ?
    Par Linlin dans le forum CORBA
    Réponses: 1
    Dernier message: 06/12/2004, 16h46
  5. [C#] Problème de casting de @IDENTITY
    Par bilb0t dans le forum Accès aux données
    Réponses: 7
    Dernier message: 03/09/2004, 09h42

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