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

Langage C++ Discussion :

Conversions implicites - Comment forcer la bonne ?


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut Conversions implicites - Comment forcer la bonne ?
    Bonjour,

    J'ai actuellement un problème en utilisant des pointeurs intelligents. En effet, ces pointeurs ont deux versions des opérateurs de déréférencement, une version constante, et une version "normale" (non constante, donc).

    Le souci est que, si on utilise la version non-constante, un traîtement parasite (copie du contenu) est réalisé, alors que la version constante du déréférencement permet de garder une unique instance, partagée entre les différents pointeurs intelligents.

    En gros, je cherche à pouvoir forcer de manière "simple" l'utilisation du déréférencement constant, quand c'est possible. Actuellement, avec un pointeur intelligent P<X> p, et une méthode X:: x() const (pouvant travailler sur un objet constant, donc), le fait d'appeler p->x() utilise le déréférencement non-constant, ce qui est gênant.


    Plus de détails sur le forum Qt (question initialement posée là-bas, mais il semblerait que le souci soit plutôt dû à une mauvaise compréhension des règles C++, de ma part, d'où ce sujet ici.)

    http://www.developpez.net/forums/d95...re-incorrecte/



    Merci par avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Avec un simple const_cast, non ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Euh... j'avais cru comprendre que le "const_cast" était là pour permettre de virer le modificateur const, non ? Si c'est le cas, ce n'est pas ce que je veux.


    En gros, la classe A a deux opérateurs, T* operator ->() const, et const T* operator ->() const.

    Je ne sais pas comment "forcer" l'un plutôt que l'autre, de manière agréable, sachant que si on écrit A->methode_const_de_T(), il a une fâcheuse tendance à utiliser le déréférencement non-constant quand même.



    Parce que, bon, je peux toujours faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const T *t = a.operator const T*();
    t->methode_const_de_T();
    mais je perds alors une bonne partie de l'intérêt du pointeur intelligent, à savoir s'utiliser comme un pointeur, sans réfléchir.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Euh... j'avais cru comprendre que le "const_cast" était là pour permettre de virer le modificateur const, non ? Si c'est le cas, ce n'est pas ce que je veux.
    Ca marche dans les deux sens.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 32
    Par défaut
    Bon à savoir, que ça marche dans les deux sens.

    Cependant, c'est pas tellement d'avoir un const *T plutôt qu'un *T, qui m'intéresse. Ce que je voudrais réellement, c'est utiliser la méthode retournant un const *T plutôt que la méthode retournant un *T.

    La raison est simple : la version non-constante ajoute une opération (un Copy On Write, via appel d'une méthode detach() ), que je ne veux surtout pas voir executée. Donc obtenir le pointeur non-constant, puis le rendre constant via un cast, n'est vraiment pas le comportement souhaité.


    N'y-a-t'il pas de moyen pour inciter le compilateur C++ à utiliser la méthode retournant le type qui correspond exactement, plutôt qu'un type approchant qui est ensuite casté pour rentrer ?

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Si ton pointeur intelligent est lui-même const, ça devrait appeler la bonne méthode, non ?

    En gros, la classe A a deux opérateurs, T* operator ->() const, et const T* operator ->() const
    Il y a un const de trop sur le premier à mon avis, ça ne peut pas marcher ça. Hop, direction la doc Qt, c'est bien ça, c'est :

    T* operator ->()
    const T* operator ->() const

    donc si tu as un const QSharedDataPointer, il appellera nécessairement la méthode const. Après, je ne sais pas si ça te pose un problème ailleurs qu'il soit const.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/11/2007, 12h31
  2. Réponses: 4
    Dernier message: 13/06/2007, 15h27
  3. [jdbc][oracle] conversion implicite erronée
    Par Jack Huser dans le forum JDBC
    Réponses: 2
    Dernier message: 30/06/2005, 10h23
  4. [Struts]comment forcer un Forward ?
    Par njac dans le forum Struts 1
    Réponses: 4
    Dernier message: 13/10/2004, 15h02
  5. [MDI] comment fermer la bonne fenêtre enfant ?
    Par KThrax dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2002, 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