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 :

Problème de cast


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 5
    Points : 9
    Points
    9
    Par défaut Problème de cast
    Bonjour à tous, lors de la compilation de mon programme, je rencontre l'erreur suivante depuis plusieurs semaines .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'helpdesk::objects::shm::shared_data::shared_data(helpdesk::objects::shm
    ::sharedmemory_type &) throw()' : cannot convert parameter 1 from 'const
    helpdesk::objects::shm::sharedmemory_type' to
    'helpdesk::objects::shm::sharedmemory_type &'
    1>        Conversion loses qualifiers
    1>
    Je voudrai juste savoir s'il y a moyen de 'caster' <const T> --> <T &> ou une astuce pour le faire en agissnt que sur le constructeur shared_data::shared_data(helpdesk::objects::shm::sharedmemory_type &)?

    J'espère que j'ai été clair ...
    Un grand merci pour ceux qui aident les débutant(e)s comme moi!

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut !

    Oui il y a moyen de le faire, mais c'est mal. C'est mal car tu autoriserais le constructeur à modifier l'objet passé en paramètre, alors qu'il est défini const à la base et qu'il y a peut être une bonne raison à ça.

    La meilleure chose à faire, c'est d'ajouter const aussi dans la signature du constructeur, si ce dernier ne modifie en effet pas l'objet.
    Find me on github

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Un grand merci, suite à la modification que tu m'as suggérée, cela a compilé mais j'ai 2 questions supplémentaires :

    qu1) le message d'erreur parlait de probleme de conversion de "const type1" vers "type1 &" ce qui pour moi signifiait 2 problemes:
    - const --> non-const
    - value -> reference
    Or tu m'as aidé a en corriger qu'une seule et j'aimerai comprendre pourquoi cela a suffit?

    qu2) la variable ne sera constante que lors de la construction, juste ? rien n'empeche de la modifier par la suite via des accesseurs, non ?

    Merci en tout cas!

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Citation Envoyé par helene_de_fiennes Voir le message
    qu1) le message d'erreur parlait de probleme de conversion de "const type1" vers "type1 &" ce qui pour moi signifiait 2 problemes:
    - const --> non-const
    - value -> reference
    Or tu m'as aidé a en corriger qu'une seule et j'aimerai comprendre pourquoi cela a suffit?
    Question pertinente, tu pointes justement ici l'intérêt des références. Pas besoin de lui passer explicitement une adresse, passer l'objet directement fonctionnera. Le but étant de se passer de pointeur. La conversion de valeur à référence est autorisée et implicite.

    Note qu'une référence ne peut pas pointer sur une autre valeur une fois initialisée. C'est justement parce que les références ont été initialement créées pour servir dans les signatures de méthodes. Dans le corps de ton constructeur, tu auras une référence vers l'objet et non une copie de celui-ci. D'ou l'intérêt du const pour le protéger des modifications.

    J'ajoute au passage, même si ça semble évident, que la conversion de non-const à const est elle aussi autorisée et implicite.

    Citation Envoyé par helene_de_fiennes Voir le message
    qu2) la variable ne sera constante que lors de la construction, juste ? rien n'empeche de la modifier par la suite via des accesseurs, non ?
    Justement si, tu n'aurais pas le droit d'utiliser des accesseurs sur l'objet, sauf si ceux-ci sont définis const. Const est une contrainte assez forte et il ne faut pas l'utiliser à la légère.
    Find me on github

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    La conversion de valeur à référence est autorisée et implicite.
    Cela ne devrait-il pas être vrai uniquement dans le cas où le corps de la fonction ne modifie pas cet argument, dans une vue d'optimisation ? Car le but du passage par valeur est justement de pouvoir modifier la valeur de l'argument sans modifier la valeur source. Si les deux sont interchangeables...

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Salut

    Citation Envoyé par oodini Voir le message
    Cela ne devrait-il pas être vrai uniquement dans le cas où le corps de la fonction ne modifie pas cet argument, dans une vue d'optimisation ? Car le but du passage par valeur est justement de pouvoir modifier la valeur de l'argument sans modifier la valeur source. Si les deux sont interchangeables...
    Le fait est que c'est autorisé. Si tu veux optimiser en utilisant ton argument comme une variable à part entière, il ne faut pas mettre une référence. Le changement sera d'ailleurs transparent pour le code appelant.

    Celà dit, utiliser les appels d'arguments pour économiser de la réservation mémoire n'est pas une super méthode et dans la grande majorité des cas, pas utile.
    Find me on github

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 5
    Points : 9
    Points
    9
    Par défaut
    Merci jblecanard !

    PS: Je me rends compte que le monde du C++ est vaste

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 50
    Points
    50
    Par défaut
    Plus je bosse en C++ plus je me rend compte que je ne sais rien ^^
    Au fait helene pense au bouton "probleme résolu"

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

Discussions similaires

  1. [CASTS]problème de cast de Time
    Par DeVoN dans le forum Langage
    Réponses: 7
    Dernier message: 22/02/2006, 17h24
  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