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 const et de pointeur dans une méthode


Sujet :

C++

  1. #1
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut Problème de const et de pointeur dans une méthode
    Bonjour,

    Dans une méthode d'une classe A, j'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EXInstance AskInstanceValue(int i) {
    return gcnew EXInstance(pFile->AskInstances()[i].Value());
    }
    Voici le constructeur de ma classe EXInstance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    EXInstance(EX_Instance* pI) 
    {
    pInstance=pI;
     }
    La méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pFile->AskInstances()[i].Value()
    retourne un const EX_Component *, je n'ai pas la main sur le code de cette DLL (code compilé en DLL).

    Voici l'erreur retournée :
    Erreur 3 error C2664: (..) : impossible de convertir le paramètre 1 de 'const EX_Component *' en 'EX_Component *'
    Pouvez-vous m'éclairer s'il vous plaît, je ne suis pas un spécialiste en pointeur... ^^

    Merci!

  2. #2
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Le constructeur de EXInstance prend en paramètre un const EX_Instance*, autrement dit un pointeur constant sur un EX_Instance.
    Constant signifie que l'objet ne pourra pas être modifié par la méthode appelante (ici, le constructeur de EXInstance). Hors, il semblerait que tu veuilles modifier cet objet. Ce dont tu n'as pas le droit; il faut que le constructeur de EXInstance prenne un pointeur constant en paramètre.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Plus exactement, const EXInstance * est un pointeur sur des données constante (autrement dit, le pointeur est modifiable, il peut être incrémenté ou modifié pour pointer un autre objet), mais les données pointées ne sont pas modifiable.

    Pour ton code, il faudrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class EXInstance
    {
    	const EX_Instance	*pInstance;
     
    	EXInstance(const EX_Instance* pI) 
    	{
    		pInstance=pI;
     	}
    };
    :

    Il faut aussi que EX_Instance et EX_Component soit liées par un héritage.

  4. #4
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Ok donc si à un moment donné, on se retrouve avec un const dans une variable, on doit faire avec ce const dans toutes les manipulations ultérieure de la variable, c'est ca?

    Pas moyen de remettre le const en variable?

    Car cette variable const, je la récupère d'une DLL sur laquelle je n'ai pas la main d'où le problème pour la rendre variable!

  5. #5
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Ok, ok, merci pour vos réponses très précieuses. J'essai tout ca demain.

    A titre informatif, je fais ces développements dans le cadre d'un wrapper C++/CLI pour un dev C#. J'espère que ces contraintes de const ne poseront pas de problèmes.

  6. #6
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Vonziz Voir le message
    Pas moyen de remettre le const en variable?
    Si, je crois que c'est possible avec un const_cast. Mais je te déconseille TRÈS FORTEMENT de le faire. Car si la librairie renvoie un const, c'est qu'il y a une bonne raison (conceptuelle ou pratique)... A toi alors de revoir ta propre conception.
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  7. #7
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Oké c'est bon à savoir. Je verrais ca demain et je vous recontacte si j'ai des difficultés. Merci encore. +++

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Vonziz Voir le message
    Ok donc si à un moment donné, on se retrouve avec un const dans une variable, on doit faire avec ce const dans toutes les manipulations ultérieure de la variable, c'est ca?

    Pas moyen de remettre le const en variable?
    La 'constitude' se propage dans tous les appels, c'est une contrainte, mais qui existe pour une bonnes raisons, généralement pour garantir qu'un utilisateur ne fasse pas de bêtise avec les ressources qu'on lui confient.

    Pour se débarrasser du 'const', deux solutions :
    - La moche, en utilisant le const_cast<>, mais dans ce cas tu violes les contraintes imposés (généralement pour de bonne raison)
    - L'autre, consistant à copier l'objet constant dans une nouvelle instance non constante (qui t'appartient et dont tu assures la gestion)

  9. #9
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Dernière question de ce débat très intéressant : Ok pour respecter cette contrainte de const. Autant programmer proprement, je suis le premier à le dire...

    Seulement, comment fait-on si on utilise des appels système qui réclament des données "non constées", il n'y a pas un problème de typage dans ce genre de cas?! Le compilateur nous jette ou pas?

  10. #10
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Vonziz Voir le message
    Seulement, comment fait-on si on utilise des appels système qui réclament des données "non constées",
    De quels appels tu parles?
    Citation Envoyé par Vonziz Voir le message
    il n'y a pas un problème de typage dans ce genre de cas?! Le compilateur nous jette ou pas?
    Je pars toujours du principe que les gens qui font les APIs sont plus intelligents que moi, et que telle fonction a tel prototype et pas un autre pour une bonne raison .
    Mais ça dépends de ces appels système dont tu parles...
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  11. #11
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Je prends un exemple infondé mais qui te situeras le fond de ma pensée.

    Imagine que tu récupères un const char* de ton API faite par ton développeur super intelligent super puissant.

    Imagine maintenant que tu appelles une routine de system32 du style fprintf(char*) (=> Appel inexistant en réel).

    Si tu fais fprtinf de ton const char*, le compilateur va te jeter car il attend un char*?

    J'espère avoir été clair... ^^

  12. #12
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Oui il va te jeter, car tu n'as pas à modifier le texte renvoyé. Mais rien ne t'empêche de créer une copie à partir de celui-ci et d'en faire ce que tu veux après... (rajouter des caractères, en enlever, ..)
    Pour les chaînes de caractères ce n'est pas tellement important. Ça devient beaucoup plus délicat quand il commence à s'agir d'objets plus complexes, comme des classes. Car dans ton cas par exemple, copier l'objet pour le modifier est clairement une entorse à la conception de la librairie. Il est possible que la librairie n'aie pas envisagé l'utilisation que tu en fais, mais je te conseille plutôt de t'adapter à elle que l'inverse. Car ça pourrait être la source de bugs plus vicieux dans ton code (utilisation non prévue de pointeurs, variables ou autres,...).
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  13. #13
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Normalement, l'API faite par ton développeur super intelligent super puissant te fourni des méthodes permettant de modifier l'objet à partir de l'instance const qu'il t'a retourné et/ou d'obtenir un objet non const.

  14. #14
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    Merci à tous, explications très claires et complètes.

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Attends, tu programmes en C++ ou en C++/CLI ?
    J'ai vu un gcnew dans le code de ton premier post...
    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.

  16. #16
    Membre habitué Avatar de Vonziz
    Inscrit en
    Décembre 2006
    Messages
    215
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 215
    Points : 131
    Points
    131
    Par défaut
    C'est du C++/CLI.

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

Discussions similaires

  1. Problème de variable membre en pointeur dans une classe
    Par medrimonia dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2012, 18h00
  2. Problème sur un pointeur dans une structure
    Par steph_1 dans le forum Langage
    Réponses: 5
    Dernier message: 05/09/2007, 18h59
  3. Réponses: 3
    Dernier message: 14/04/2007, 16h06
  4. Réponses: 2
    Dernier message: 15/11/2004, 15h12
  5. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14

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