getters et setters : style ? - C++ - Programmation
Marsh Posté le 11-01-2005 à 11:25:55
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;}
Marsh Posté le 11-01-2005 à 12:00:53
spokup a écrit : euh je vois pas bien l'intérêt... |
J'ai pas encore vu l'inlining.
++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 :
|
n'est pas plus adapté. Mais là encore l'apport de const me trouble. Je ne viens pas vraiment ce que cela apporte.
Marsh Posté le 11-01-2005 à 12:07:32
Mutsumi a écrit : |
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 :
|
serait tout aussi bien en
Code :
|
(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)
Marsh Posté le 11-01-2005 à 14:05:31
chrisbk 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) ?
Marsh Posté le 11-01-2005 à 14:27:19
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...
Marsh Posté le 11-01-2005 à 14:33:53
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 :
|
Est-ce que la référence est const ici ? Pour moi oui. J'écrirais volontiers :
Code :
|
Et pour des bêtes int, on préfère la copie ou la référence ?
Marsh Posté le 11-01-2005 à 14:41:28
Mutsumi a écrit : J'ai compris quelque chose moi.
|
et tu fais fais bien
Mutsumi a écrit : |
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
Marsh Posté le 11-01-2005 à 14:54:11
Bon, ben c'est super. Je pense que j'ai compris. Merci beaucoup à tous.
Marsh Posté le 11-01-2005 à 15:02:13
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.
Marsh Posté le 11-01-2005 à 17:11:56
Marsh Posté le 11-01-2005 à 17:23:10
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
Marsh Posté le 12-01-2005 à 23:07:03
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.
Marsh Posté le 13-01-2005 à 00:04:47
Taz a écrit : |
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 ?)
Marsh Posté le 13-01-2005 à 00:20:55
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.
Marsh Posté le 13-01-2005 à 12:07:39
http://c.developpez.com/faq/cpp/?p [...] accesseurs
http://c.developpez.com/faq/cpp/?page=OO#CLASS_Get_Set
Marsh Posté le 13-01-2005 à 12:14:08
HelloWorld a écrit : http://c.developpez.com/faq/cpp/?p [...] accesseurs |
pourquoi j'ai l'impression que tu es un des co auteurs de ces docs ?
Marsh Posté le 13-01-2005 à 12:27:30
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
Marsh Posté le 13-01-2005 à 13:01:55
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...
Marsh Posté le 13-01-2005 à 13:06:25
je faisais référence à ça http://www.open-std.org/jtc1/sc22/ [...] /n1615.pdf
Marsh Posté le 13-01-2005 à 14:03:34
Un thread intéressant aussi:
http://www.google.fr/groups?hl=fr& [...] %26hl%3Dfr
Marsh Posté le 13-01-2005 à 19:47:50
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. |
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
Marsh Posté le 13-01-2005 à 19:58:43
bin rien, ton 'this' se transforme en 'const this' dans une fonction 'const', c'est tout (si je comprends bien ta question)
Marsh Posté le 13-01-2005 à 19:59:51
Oualb a écrit : je comprends pas bien ton const this |
void A::f() const;
Oualb a écrit : |
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 : |
je vois pas le rapport.
Marsh Posté le 13-01-2005 à 20:17:08
en un peu plus clair
http://casteyde.christian.free.fr/ [...] x3169.html
Marsh Posté le 13-01-2005 à 20:22:13
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. |
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
Marsh Posté le 13-01-2005 à 22:54:40
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 :
|
ca a un sens ou pas, en rapport avec ce que disait Taz dans son post un peut avant
Marsh Posté le 13-01-2005 à 22:57:00
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
Marsh Posté le 13-01-2005 à 22:59:24
Oualb a écrit : enfin un qui comprend |
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'
Marsh Posté le 13-01-2005 à 23:21:19
Oualb a écrit : non mais c'est quand meme incroyable ca !!!!!!!!!!
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 !
Pis const merde, je connais pas.
Marsh Posté le 15-01-2005 à 12:00:45
Par rapport au lien donné par Taz, je ne comprends pas pourquoi le code suivant fonctionne :
dans la classe de test, on a :
Code :
|
et dans le constructeur :
Code :
|
pour que ROProperty puisse appeller la fonction myKids :
Code :
|
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.
Marsh Posté le 11-01-2005 à 11:15:40
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.
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.