Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1296 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  paramètre "const"

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

paramètre "const"

n°1375384
leonhard
Posté le 26-05-2006 à 11:11:22  profilanswer
 

Bonjour

 

Je suis en train d'apprendre le langage C++ (j'avais jusqu'ici surtout fait du java) et j'ai un petit souci de compréhension avec les paramètres "const" d'une méthode

 

Dans une classe "Point3D" j'ai trois membre private x,y,z de type double. J'ai aussi la méthode "void translate (const Vector3D & v)

 
Code :
  1. void
  2. Point3D::translate (const Vector3D& v)
  3. {
  4.     x += v.getX();
  5.     y += v.getY();
  6.     z += v.getZ();
  7. }
 


Le compilateur m'indique une erreur :

 

2    error: passing `const Vector3D' as `this' argument of `double Vector3D::getX()' discards qualifiers    Point3D.cpp    ccollisionstest    line 125  

 

Par contre si je supprime le "const", l'erreur disparaît. J'avais crû comprendre que le mot clé "const" signifiait que le paramètre n'était pas modifié, ce qui est mon cas. Pouvez-vous s.v.p. éclairer ma lanterne ?

 

D'avance merci

 

P.S. Je ne sais pas si cela à de l'importance, mais mon compilateur est gcc 3.3.5 sous linux.

 

mood
Publicité
Posté le 26-05-2006 à 11:11:22  profilanswer
 

n°1375391
nargy
Posté le 26-05-2006 à 11:21:02  profilanswer
 

const, est équivalent de final en java.
donc, tu ne peut pas modifier (affectations: = += *= ...) une variable <<const>>, seulement l'initialiser (passage de paramètre) et la lire.

n°1375392
nargy
Posté le 26-05-2006 à 11:23:11  profilanswer
 

ha oui, les fonctions peuvent être <<const>>.
ex:
int getX() const;
-> renvoie la composante X, ne modifie pas l'objet vecteur.
 
Il doit te manquer le <<const>> sur les fonctions getX, getY et getZ, pour indiquer que ces fonctions ne modifient pas l'objet vecteur sur lesquelles elles travaillent.

n°1375394
leonhard
Posté le 26-05-2006 à 11:24:26  profilanswer
 

c'est justement ce que j'avais compris. Mais les méthodes getX(), getY() et getZ() ne font que lire la valeur du membre x de la classe Vector3D... donc cette valeur n'est pas modifiée il me semble... Manifestement il y a encore des mystères au royaume de C++  :pt1cable:  
 
Merci de ton explication

n°1375397
zapan666
Tout est relatif
Posté le 26-05-2006 à 11:25:38  profilanswer
 

getX(), getY(), etc de Vector3D sont t'elles en const ?
 

Code :
  1. int Vector3D::getX() const {
  2. // blabla
  3. }


 
Mettre un const sur l'obj indique que l'appel a la fonction ne le modifie pas.
 
Dans ton cas, tu appel des fonctions non const, donc qui modifie l'obj, sur un objet constant, d'ou l'erreur
 
 
edit : toasted


Message édité par zapan666 le 26-05-2006 à 11:26:19

---------------
my flick r - Just Tab it !
n°1375403
nargy
Posté le 26-05-2006 à 11:30:09  profilanswer
 

non, elle n'est pas modifiée, mais tu doit quand même indiquer que ces fonctions sont <<const>>.
 
Ce qu'il se passe, c'est que en C++, la définition des fonction, et le corps, peuvent être définis dans différents fichiers. Celà permet de faire une interface de programmation (définition des appels de fonctions) sans avoir à fournir d'emblé le code. (ça pourrait ressembler à une interface...)
 
Ansi, tu est obligé d'indiquer lorsqu'une fonction ne modifie pas l'objet.
 
ex:

Code :
  1. class Vector ...
  2.   int getX() const; // définition de l'appel
  3. // plus loin, ou dans un autre fichier:
  4. int Vector::getX() const
  5. { return x; } // corps de la fonction


Tu peut alors utiliser la fonction getX() sans connaître le code associé. Celà permet d'associer un code après la définition de la fonction, par exemple lors de l'édition de lien, ou lors de l'utilisation d'une librairie.

n°1375436
skelter
Posté le 26-05-2006 à 12:00:45  profilanswer
 

Citation :

Ce qu'il se passe, c'est que en C++, la définition des fonction, et le corps, peuvent être définis dans différents fichiers.


 
oui mais c'est pas ca l'explication, une methode d'objet recoit toujours en parametre "caché" l'objet sur lequel elle s'applique appelé this dans la méthode. C'est comme si elle recevait un 'object * const this'  (this contient l'adresse d'un 'object') en parametre, et quand tu la specifies const ca serait un 'object const * const this' (this contient l'adresse d'un 'object const'. Apres c'est la logique, la conversion 'object const' -> 'object' est interdite

n°1375448
leonhard
Posté le 26-05-2006 à 12:22:44  profilanswer
 

Oki, effectivement je n'avais pas vu le "truc" de la fonction const. En bon petit programmeur Java, j'avais imaginé "const == final", mais pour les méthodes ça a effectivement une autre signification...  
 
Merci de vos lumières...  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  paramètre "const"

 

Sujets relatifs
probleme de parametre privé dans classeProblème de traitement des paramètre avec getopt
[Résolu] Passage Paramètre TListFonction qui appelle une fonction en parametre
C : Mettre une valeur numérique dans un const charDans une méthode vaut il mieux exploiter le paramètre ou l'attribut ?
actualiser des parametre[Annotation] Paramètre d'annotation de type Class
recherche d'un parametre[C++/résolu] donnée static const Pi=3.14
Plus de sujets relatifs à : paramètre "const"


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR