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 :

Je ne comprends pas ce qu'est cet objet ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut Je ne comprends pas ce qu'est cet objet ?
    Bonjour tout le monde,

    J'ai une classe nommée CTableauGenerique.

    Dans un de mes exercices, on crée un objet de ce type là, mais s'est la suite que je ne comprends pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CTableauGenerique	TabVehicules((const CGenerique&)CTabVehicules())
    Sauriez-vous m'expliquez ce que s'est ?

    Je vois qu'il y'a un cast (CGenerique&) mais CTabVehicules() me trouble...

    Merci d'avance pour votre aide.

    beegees

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Gia,

    Comme pour ton autre sujet, va voir la classe CTabVehicules.

    a priori, elle dérive de CGenerique.

  3. #3
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gia,

    Comme pour ton autre sujet, va voir la classe CTabVehicules.

    a priori, elle dérive de CGenerique.
    Bonjour,

    Il me semble que s'est plus compliqué que pour mon premier message, non ?

    Merci pour ton aide.

    beegees

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Ta vraiment un problèem avec la création d'objet !
    CTabVehicules() crée un objet de type CTabVehicules en appelant le constructeur par défaut.Ensuite on cast cet objet en référence constante de type CGenerique pour passer le tout au constructeur de TabVehicules, appellé en tant que constructeur d'une classe mère.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Si le code est généralement lu de gauche à droite, il est, le plus souvent à interpréter... de droite à gauche

    Ainsi, la première chose qui sera effectivement faite dans une expression complexe, c'est celle qui se trouve à l'extrème droite de l'expression (du moins, quand il ne s'agit pas d'un test, on est bien d'accord )

    En effet, le comportement indiqué par Davidbrcz est bel et bien le comportement observé, et voici la raison:
    • CTabVehicules() : appelle le constructeur par défaut de la classe de CTabVehicules (car il faut bien un objet pour arriver à le caster )
    • (const CGenerique&) caste (ce qui suit) en une référence constante sur un objet de type CGenerique
    • la parenthèse ouverte avant le (const CGenerique&) et fermée apres le CTabVehicules() regroupes les informations à passer au constructeur de CTableauGenerique
    • L'objet construit pend le doux nom de TabVehicules, et, enfin, en début de ligne, on retrouve le type de l'objet à construire

    Ceci dit, ce code est de nature à souvlever énormément de questions, et à e faire hurler plus d'un "puriste"...

    D'abord à cause du fait que c'est un cast "C style" qui est utilisé:

    Ce genre de transtypage permet tout, y compris le pire.
    On ne peut en effet jamais être sur que l'objet à transtyper est compatible, du point de vue de l'utilisation de la mémoire, avec l'objet dans lequel il doit être transtypé...

    On préférera le plus souvent utiliser une méthode plus "controlée" du C++ telle que le static_cast ou le dynamic_cast
    Ensuite, parce que l'on peut se poser la question de l'utilité même du transtypage.

    En effet, le code semble indiquer que la classe CTabVehicules est compatible (et sans doute dérive) de la classe CGenerique.

    Si ce n'est pas le cas, tu comprendra les risques encourus par le transtypage "C style" (et on pourrait se poser la question de savoir pourquoi ce n'est pas le cas), et, par contre, si c'est le cas, il faut savoir que l'objet créé est d'office un objet constant, et peut très bien faire office de référence constante sur un objet de la classe parent... ce qui rend le transtypage parfaitement inutile

    En effet, les objet temporaires (tels que ceux créé spécifiquement pour servir d'argument passé à une fonction) ne peuvent s'intégrer que dans des fonctions pour lesquels l'argument est demandé sous forme de référence constante, ce qui *semble* etre le but du transtypage
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Ta vraiment un problèem avec la création d'objet !
    CTabVehicules() crée un objet de type CTabVehicules en appelant le constructeur par défaut.Ensuite on cast cet objet en référence constante de type CGenerique pour passer le tout au constructeur de TabVehicules, appellé en tant que constructeur d'une classe mère.
    Bonjour Davidbrcz,

    Un tout grand merci pour ta réponse.

    Jamais je n'aurais trouvé cela sans toi

    Encore un tout grand merci.

    beegees

    Citation Envoyé par koala01 Voir le message
    Salut,

    Si le code est généralement lu de gauche à droite, il est, le plus souvent à interpréter... de droite à gauche

    Ainsi, la première chose qui sera effectivement faite dans une expression complexe, c'est celle qui se trouve à l'extrème droite de l'expression (du moins, quand il ne s'agit pas d'un test, on est bien d'accord )

    En effet, le comportement indiqué par Davidbrcz est bel et bien le comportement observé, et voici la raison:
    • CTabVehicules() : appelle le constructeur par défaut de la classe de CTabVehicules (car il faut bien un objet pour arriver à le caster )
    • (const CGenerique&) caste (ce qui suit) en une référence constante sur un objet de type CGenerique
    • la parenthèse ouverte avant le (const CGenerique&) et fermée apres le CTabVehicules() regroupes les informations à passer au constructeur de CTableauGenerique
    • L'objet construit pend le doux nom de TabVehicules, et, enfin, en début de ligne, on retrouve le type de l'objet à construire

    Ceci dit, ce code est de nature à souvlever énormément de questions, et à e faire hurler plus d'un "puriste"...

    D'abord à cause du fait que c'est un cast "C style" qui est utilisé:

    Ce genre de transtypage permet tout, y compris le pire.
    On ne peut en effet jamais être sur que l'objet à transtyper est compatible, du point de vue de l'utilisation de la mémoire, avec l'objet dans lequel il doit être transtypé...

    On préférera le plus souvent utiliser une méthode plus "controlée" du C++ telle que le static_cast ou le dynamic_cast
    Ensuite, parce que l'on peut se poser la question de l'utilité même du transtypage.

    En effet, le code semble indiquer que la classe CTabVehicules est compatible (et sans doute dérive) de la classe CGenerique.

    Si ce n'est pas le cas, tu comprendra les risques encourus par le transtypage "C style" (et on pourrait se poser la question de savoir pourquoi ce n'est pas le cas), et, par contre, si c'est le cas, il faut savoir que l'objet créé est d'office un objet constant, et peut très bien faire office de référence constante sur un objet de la classe parent... ce qui rend le transtypage parfaitement inutile

    En effet, les objet temporaires (tels que ceux créé spécifiquement pour servir d'argument passé à une fonction) ne peuvent s'intégrer que dans des fonctions pour lesquels l'argument est demandé sous forme de référence constante, ce qui *semble* etre le but du transtypage
    Salut Koala01,

    Un super grand et sincère merci pour ta réponse qui m'aide énormément.

    Jamais je n'aurais trouvé sans votre aide !

    Comme je l'ai dis, pour l'instant j'ai énormément de mal et l'examen approche à grand pas.

    Ton explication est claire et précise, complète et très détaillée.

    Il y'a quand même une question que je me pose :

    à quoi sert de faire un tel objet ?

    As-tu besoin de l'ensemble de mon code pour répondre à cette question ?

    Je vais essayer de répondre à au moins une de tes questions :

    Koala dit :

    Ensuite, parce que l'on peut se poser la question de l'utilité même du transtypage.
    Voici ce que le Prof dit sur CTableauGenerique TabVehicules((const CGenerique&)CTabVehicules());


    Je vais créer une variable de type CTableauGénérique que j'appelle TabVehicules et en fait
    Dans ce tableau là les éléments seront des CTabVéhicules donc dans l'objet poubelle ça doit être CTabVéhicules, malheureusement comme CTabVéhicules hérite avant tout de CTableauGénérique avant d'hériter de CGénérique là j'utilise le constructeur par copie de CTableauGénérique si je veux lui préciser que cet objet là s'est pas une source, une copie mais le model objet poubelle je dois faire une conversion pour dire non "ça s'est un objet générique" et là il utilisera le bon constructeur, le constructeur spécifique qui prend le modèle de poubelle en paramètre donc là il n'essaiera pas de dupliquer les données de tableau vide CTabVéhicules qui est là mais il considérera que s'est mon objet poubelle.
    Voilà, encore meric pour ton aide, en espèrant encore avoir de tes nouvelles.

    Beegees

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

Discussions similaires

  1. Quel est cet objet ? (Image jointe)
    Par Spredzy dans le forum Android
    Réponses: 2
    Dernier message: 14/04/2010, 02h09
  2. Quel est cet objet attendu sur Instr ?
    Par Walterbelo dans le forum VBScript
    Réponses: 5
    Dernier message: 15/06/2009, 21h03
  3. Réponses: 6
    Dernier message: 12/08/2007, 13h29
  4. Réponses: 1
    Dernier message: 22/05/2007, 12h51
  5. [c#] Quel est cet objet ?
    Par SDuh dans le forum Windows Forms
    Réponses: 5
    Dernier message: 28/02/2006, 13h27

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