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

  FORUM HardWare.fr
  Programmation
  C++

  getters et setters : style ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

getters et setters : style ?

n°950598
Mutsumi
Abracadabra
Posté le 11-01-2005 à 11:15:40  profilanswer
 

Bonjour,
 
Je suis en auto-formation sur C++ avec le livre de Bjarne Stroustrup. J'ai créé hier ma première classe, et je me pose une question sur les setters et les getters.
 

Code :
  1. class Person
  2. {
  3.   private:
  4.     int age;
  5.     string name;
  6.   public:
  7.     int get_age();
  8.     void set_age(int age);
  9.     string get_name();
  10.     void set_name(string name);
  11. }


 
Plus je regarde le code, et plus je me demande si mes getters et setters ne devraient pas travailler avec des références ou des pointeurs. Mon peu de culture m'empêche de trancher.
 
Vous feriez quoi, vous ?


---------------
La différence entre la théorie et la pratique c'est qu'en théorie il n'y a pas de différence, mais qu'en pratique il y en a une.
mood
Publicité
Posté le 11-01-2005 à 11:15:40  profilanswer
 

n°950608
spokup
Posté le 11-01-2005 à 11:25:55  profilanswer
 

euh je vois pas bien l'intérêt...
 
par contre je te conseille de les déclarer inline
 
exemple
 
int get_age() {return age};
void set_age(int a) {age = a;}

n°950612
cricri_
Posté le 11-01-2005 à 11:32:42  profilanswer
 

Peut-être passer la string par réfèrence constante ?

n°950617
++fab
victime du syndrome IH
Posté le 11-01-2005 à 11:38:59  profilanswer
 

et les const ??? (pour les get*)

n°950637
Mutsumi
Abracadabra
Posté le 11-01-2005 à 12:00:53  profilanswer
 

spokup a écrit :

euh je vois pas bien l'intérêt...
 
par contre je te conseille de les déclarer inline
 
exemple
 
int get_age() {return age};
void set_age(int a) {age = a;}


J'ai pas encore vu l'inlining.  :o  
 

++fab a écrit :

et les const ??? (pour les get*)


Il faut déclarer les getters const ? Qu'est-ce que ça va changer ?
 
 

cricri_ a écrit :

Peut-être passer la string par réfèrence constante ?


Je me damnde en effet, si :

Code :
  1. public:
  2.     void set_name(string& name);


n'est pas plus adapté. Mais là encore l'apport de const me trouble. Je ne viens pas vraiment ce que cela apporte.


Message édité par Mutsumi le 11-01-2005 à 14:34:31

---------------
La différence entre la théorie et la pratique c'est qu'en théorie il n'y a pas de différence, mais qu'en pratique il y en a une.
n°950642
chrisbk
-
Posté le 11-01-2005 à 12:07:32  profilanswer
 

Mutsumi a écrit :


Il faut déclarer les getters const ? Qu'est-ce que ça va changer ?


 
moulte
si plus tard tu recuperes 'const Person [&/*/...]' ca te permettra d'appeler le geter (vu qu'il est aussi declaré const. Sur un object 'const' ne peux appeler que des fonctions 'const')
 
D'une certaine maniere c'est une bonne habitude a prendre de mettre des 'const' la ou y'en faut (sur les constantes (virage des vieux #define par ex), sur sur les fonctions ne faisant rien, et la, typiquement ton  

Code :
  1. std::string getName()


 
serait tout aussi bien en  
 

Code :
  1. const std::string & getName() const;


 
(on retourne une reference (plus leger a retourner qu'un nouvel objet), mais on interdit la modification du contenu de cette reference. Par ailleurs vu que notre fonction ne touche pas en ecriture a ses données membre on la déclare const)


Message édité par chrisbk le 11-01-2005 à 12:08:31
n°950736
Mutsumi
Abracadabra
Posté le 11-01-2005 à 14:05:31  profilanswer
 

chrisbk a écrit :


Code :
  1. const std::string & getName() const;




Si je reformule afin de vérifier que j'ai compris, alors on déclare une méthode const, ie qui garantie qu'on ne modifie pas l'état de l'instance, et en plus on déclare que la référence retournée est const, ie que l'on ne peut pas la modifier. Quel genre de modifications sur la référence sont interdites (je ne suis pas sûr que ma question ait un sens) ?


---------------
La différence entre la théorie et la pratique c'est qu'en théorie il n'y a pas de différence, mais qu'en pratique il y en a une.
n°950765
chrisbk
-
Posté le 11-01-2005 à 14:27:19  profilanswer
 

Mutsumi a écrit :

Si je reformule afin de vérifier que j'ai compris, alors on déclare une méthode const, ie qui garantie qu'on ne modifie pas l'état de l'instance, et en plus on déclare que la référence retournée est const, ie que l'on ne peut pas la modifier. Quel genre de modifications sur la référence sont interdites (je ne suis pas sûr que ma question ait un sens) ?


 
bin tout ce qui sera 'non const' sur la reference, genre '=', les fonctions 'non-const', l'acces en ecriture a des variables publics...

n°950770
Mutsumi
Abracadabra
Posté le 11-01-2005 à 14:33:53  profilanswer
 

chrisbk a écrit :

bin tout ce qui sera 'non const' sur la reference, genre '=', les fonctions 'non-const', l'acces en ecriture a des variables publics...


J'ai compris quelque chose moi.
 

Code :
  1. void set_name(std::string & name);


 
Est-ce que la référence est const ici ? Pour moi oui. J'écrirais volontiers :

Code :
  1. void set_name(const std::string & name);


 
Et pour des bêtes int, on préfère la copie ou la référence ?


---------------
La différence entre la théorie et la pratique c'est qu'en théorie il n'y a pas de différence, mais qu'en pratique il y en a une.
n°950779
chrisbk
-
Posté le 11-01-2005 à 14:41:28  profilanswer
 

Mutsumi a écrit :

J'ai compris quelque chose moi.
 

Code :
  1. void set_name(std::string & name);


 
Est-ce que la référence est const ici ? Pour moi oui. J'écrirais volontiers :

Code :
  1. void set_name(const std::string & name);




et tu fais fais bien
 

Mutsumi a écrit :


Et pour des bêtes int, on préfère la copie ou la référence ?


 
bin pour le int (et les autres types primitifs tels que float, double, char...), tu suis generalement le schema suivant :
parametre de type in : copie
parametre de type in/out, out : reference
 
 
 
 

mood
Publicité
Posté le 11-01-2005 à 14:41:28  profilanswer
 

n°950788
Mutsumi
Abracadabra
Posté le 11-01-2005 à 14:54:11  profilanswer
 

Bon, ben c'est super. Je pense que j'ai compris. Merci beaucoup à tous.


---------------
La différence entre la théorie et la pratique c'est qu'en théorie il n'y a pas de différence, mais qu'en pratique il y en a une.
n°950793
++fab
victime du syndrome IH
Posté le 11-01-2005 à 15:02:13  profilanswer
 

un autre schéma :
tu es sur que la taille de l'objet à passer est inférieur ou égal à la taille d'un pointeur (ou tu le suppose fortement) (*) --> copie
dans le cas contraire --> reférence ou référence constante.
Si tu ne peux pas savoir (taille non borné, généricité, ...)
--> référence ou référence constante.
EDIT: NB : pour les types de retour, il faut etre conscient du risque pris en retournant une référence. Ainsi que des limitations qu'engendrent le retour d'une référence constante.
 
(*) La norme ne dit rien sur la taille d'un type intégré ...
Elle établit juste une relation < entre certains. La taille d'un pointeur est elle aussi variable suivant les architectures.


Message édité par ++fab le 11-01-2005 à 17:33:01
n°950948
Mutsumi
Abracadabra
Posté le 11-01-2005 à 17:11:56  profilanswer
 

:jap:


---------------
La différence entre la théorie et la pratique c'est qu'en théorie il n'y a pas de différence, mais qu'en pratique il y en a une.
n°950968
Taz
bisounours-codeur
Posté le 11-01-2005 à 17:23:10  profilanswer
 

j'aimerais bien que certaines réléchissent un peu avant de coller des références partout. Même si tout à déjà était dit, faut vous mettre profond que
 
& -> modification
const & -> lecture seule
this -> modification
const this -> lecture seule.
 
la question n'est pas "qu'est-ce qui est rapide" mais "qu'est-ce qui est correcte". Ton getter pas const, c'est pas un accesseur, c'est un modificateur. Ton setter avec paramètre par référence, il est gentil mais il risque de défoncer son paramètre.
 
parametre de type in : copie
gros paramètre de type in : const reference
parametre de type in/out, out : reference
 
 
les même règles s'appliquent à this, paramètre implicite des fonctions membres

n°952075
Profil sup​primé
Posté le 12-01-2005 à 23:07:03  answer
 

je comprends pas bien ton const this
tu veux dire qu'on peut ecrire dans du code 'const this' ?
et que du coup ca donne un pointeur de type 'MaClass const * const' au lieu de 'MaClass * const' pour this dans une methode pas const ?
 
si c'est ça je connaissais pas, et je vois pas trop l'interet, vu qu'un truc pas const se tranforme tout seul en const si jamais il est utilisé par quelquechose qui veut du const.

n°952095
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-01-2005 à 00:04:47  profilanswer
 

Taz a écrit :


parametre de type in : copie
gros paramètre de type in : const reference
parametre de type in/out, out : reference


 
const ne passe pas que l'adresse ?
(bête question, mais comme en Delphi c'est le cas je pensais qu'en C++ ça l'était aussi - const seul n'a pas d'effet au niveau du code généré alors ?)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°952100
blackgodde​ss
vive le troll !
Posté le 13-01-2005 à 00:20:55  profilanswer
 

me semble que const n'a jamais d'effet sur le code généré, c'est surtout un garde-fou pour l'utilisation de la classe.
 
Oualb : l'interet =>
 
void foo(const Bar &b);
 
=> dans foo, tu ne pourras utiliser que les méthodes const de b.


---------------
-( BlackGoddess )-
n°952110
Taz
bisounours-codeur
Posté le 13-01-2005 à 01:10:38  profilanswer
 

Bien sur que const a un effet sur le code généré !

n°952275
HelloWorld
Salut tout le monde!
Posté le 13-01-2005 à 12:07:39  profilanswer
 
n°952280
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 13-01-2005 à 12:14:08  profilanswer
 
n°952284
Taz
bisounours-codeur
Posté le 13-01-2005 à 12:27:30  profilanswer
 

pourquoi tout le monde veut absolument un set et un get, alors que la meme fonction du nom du membre peut être surchargé.
 
Et puis y a des couches template qui existent pour faire ça comme des property C# / Python

n°952301
gatorette
Posté le 13-01-2005 à 13:01:55  profilanswer
 

boost::call_traits est très pratique quand on ne sait pas quel est le meilleur choix pour passer un paramètre à une fonction ou renvoyer une valeur d'une fonction (notamment quand on ne connait pas le type du paramètre). Au pire, on peut s'inspirer du tableau dans la doc pour choisir...


---------------
each day I don't die is cheating
n°952305
Taz
bisounours-codeur
Posté le 13-01-2005 à 13:06:25  profilanswer
 
n°952331
HelloWorld
Salut tout le monde!
Posté le 13-01-2005 à 14:03:34  profilanswer
 

Un thread intéressant aussi:
http://www.google.fr/groups?hl=fr& [...] %26hl%3Dfr


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°952617
Profil sup​primé
Posté le 13-01-2005 à 19:47:50  answer
 

blackgoddess a écrit :

me semble que const n'a jamais d'effet sur le code généré, c'est surtout un garde-fou pour l'utilisation de la classe.
 
Oualb : l'interet =>
 
void foo(const Bar &b);
 
=> dans foo, tu ne pourras utiliser que les méthodes const de b.


 
t'es gentil merci ca je sais  
relis ma question et tu verras qu'elle porte sur l'expression 'const this' et pas sur 'const ' en soi même
 
d'ailleurs ca serait bien que Taz me réponde si ca le dérangeait pas trop

n°952625
chrisbk
-
Posté le 13-01-2005 à 19:58:43  profilanswer
 

bin rien, ton 'this' se transforme en 'const this' dans une fonction 'const', c'est tout (si je comprends bien ta question)

n°952626
Taz
bisounours-codeur
Posté le 13-01-2005 à 19:59:51  profilanswer
 

Oualb a écrit :

je comprends pas bien ton const this
tu veux dire qu'on peut ecrire dans du code 'const this' ?


 
void A::f() const;

Oualb a écrit :


 
 
et que du coup ca donne un pointeur de type 'MaClass const * const' au lieu de 'MaClass * const' pour this dans une methode pas const ?

commence par plcer les const comme il faut.
 
'const MaClasse * const'.
 
j'espère que tu t'es déjà aperçu que
 
this = x;
 
est une erreur;
 

Oualb a écrit :


si c'est ça je connaissais pas, et je vois pas trop l'interet, vu qu'un truc pas const se tranforme tout seul en const si jamais il est utilisé par quelquechose qui veut du const.

je vois pas le rapport.

n°952636
push
/dev/random
Posté le 13-01-2005 à 20:17:08  profilanswer
 
n°952638
el muchach​o
Comfortably Numb
Posté le 13-01-2005 à 20:22:13  profilanswer
 

blackgoddess a écrit :

me semble que const n'a jamais d'effet sur le code généré, c'est surtout un garde-fou pour l'utilisation de la classe.
 
Oualb : l'interet =>
 
void foo(const Bar &b);
 
=> dans foo, tu ne pourras utiliser que les méthodes const de b.


Ben si, A::foo(const Bar &x) et A::foo(Bar &x) sont bien deux méthodes différentes de A. Ca va au-dela du simple garde-fou du compilo. Evidemment, si tu as besoin une fois ou deux de A::foo(Bar &x) alors que seul A::foo(const Bar &x) est définie, il ne faut pas définir A::foo(Bar &x) parce qu'alors, la version const ne sert plus à rien (vu que le constness peut être court-circuité), il faut const_cast-er.
 
edit : mon exemple était con [:itm]


Message édité par el muchacho le 13-01-2005 à 20:26:15
n°952725
Profil sup​primé
Posté le 13-01-2005 à 22:54:40  answer
 

non mais c'est quand meme incroyable ca !!!!!!!!!!
 
vous comprenez le francais ou quoi ????????
je demande pas qu'on m'explique ce que veut dire const merde
 
je demande juste si ecrire

Code :
  1. const this

 ca a un sens ou pas, en rapport avec ce que disait Taz dans son post un peut avant

n°952728
Profil sup​primé
Posté le 13-01-2005 à 22:57:00  answer
 

chrisbk a écrit :

bin rien, ton 'this' se transforme en 'const this' dans une fonction 'const', c'est tout (si je comprends bien ta question)


 
enfin un qui comprend
oui c'est un peu ca mais on l'appelle toujours 'this' dans le code, pas 'const this'
certes il n'est pas du même type, mais c'est quand meme le même mot

n°952729
chrisbk
-
Posté le 13-01-2005 à 22:59:24  profilanswer
 

Oualb a écrit :

enfin un qui comprend
oui c'est un peu ca mais on l'appelle toujours 'this' dans le code, pas 'const this'
certes il n'est pas du même type, mais c'est quand meme le même mot


 
 
non, bin oui, parce que "const this" c'est foireux comme expression
Imaginons une classe A
 
dans une fonction membre non const, this sera de type 'A*'
dans une fonction membre const, this sera de type 'const A*'
 
y'a pas vraiment de const this, quoi. Mais on se comprends quand on parle de 'const this' [:icon7]


Message édité par chrisbk le 13-01-2005 à 22:59:56
n°952734
Profil sup​primé
Posté le 13-01-2005 à 23:08:55  answer
 

voila

n°952738
el muchach​o
Comfortably Numb
Posté le 13-01-2005 à 23:21:19  profilanswer
 

Oualb a écrit :

non mais c'est quand meme incroyable ca !!!!!!!!!!
 
vous comprenez le francais ou quoi ????????
je demande pas qu'on m'explique ce que veut dire const merde
 
je demande juste si ecrire

Code :
  1. const this

 ca a un sens ou pas, en rapport avec ce que disait Taz dans son post un peut avant


Non mais c'est pas  à toi que je répondais ! :kaola:  
Pis const merde, je connais pas.  :whistle:

n°953537
hellbilly
free smile
Posté le 15-01-2005 à 12:00:45  profilanswer
 

Par rapport au lien donné par Taz, je ne comprends pas pourquoi le code suivant fonctionne :
 
dans la classe de test, on a :

Code :
  1. ROProperty< int, myClass, &myClass::myKids > NumberOfChildren;


et dans le constructeur :

Code :
  1. NumberOfChildren(this);


pour que ROProperty puisse appeller la fonction myKids :

Code :
  1. Object *my_object;
  2. public:
  3.     void operator () (Object * obj)
  4.     {
  5.         my_object = obj;
  6.     }


Bon jusque là pas de pb, mais lorsque je mets en commentaire NumberOfChildren(this); ca fonctionne.
Donc je vois pas comment sans initialiser my_object, ca peut marcher.

mood
Publicité
Posté le   profilanswer
 


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

  getters et setters : style ?

 

Sujets relatifs
[CSS] Menu horizontal 1 ligne style www.macromedia.com ???C++ grille (style bataille navale)
Style css texte de baserecherche un script PHP style groupware --> gestion de points membres
Titre sous une feuille de style[CSS] Indiquer le media directement au niveau de l'attribut "style" ?
feuille de styleStyle Switcher avec un cookie
Utiliser 2 feuilles de style dans une même pagepb php -> appel d'un style css
Plus de sujets relatifs à : getters et setters : style ?


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