Je voulais savoir si il était possible de forcer l'accès à un membre
de classe privé ou protégé depuis une autre classe (un peu comme avec
le mot clé "friend"), mais sans modifier le source de la classe à
laquelle on veut accéder. (Donc, une sorte de "friend" à l'envers,
quoi)
Ne me répondez pas « Ne le fait pas, c'est mal », je sais. Je voudrais
l'utiliser dans un contexte bien précis un peu long à détailler, mais
toujours est-il qu'on ne peut pas trop faire autrement.
Pour l'instant, j'ai un truc vraiment sale :
#define private public
#define protected public
(Et si je fais #define class struct, les template <class toto> ne
compilent plus :-( )
Hmm, je ne trouve pas ça très satisfaisant intellectuellement
parlant ;-)
| Gabriel Dos Reis writes: | | > Pourquoi cela devrait-il être étonnant ? | | Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis | « Ah, finalement, non ».
Pas du tout.
Si tu déclares un *objet* const, alors tu es obligé de l'initialiser à sa création et tu ne peux pas changer son état (sauf s'il comporte de sous-objets « mutable », auquel cas, tu peux utiliser const_cast<> pour modifier ces parties là). Autrement, ça peut faire boom.
Si tu as un pointeur de type « const T* », tu ne dis pas que l'objet pointé est « constant ». Non. Tu dis simplement que le pointeur tel quel ne peut pas être directement utilisé pour potentiellement modifier l'état de l'objet pointé. En fait, tu dis « l'objet pointé est *peut-être* constant, mais ce n'est pas sûr å 100%, et dans le cas où il n'est pas en réalité constant, je veux faire cette modification-ci, avec const_cast<> ».
Pareil avec un « const T& ».
| Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est | utile, on est d'accord.
Je ne parlais pas de cas d'utilité, mais de la manière dont tu décris « const » et « const_cast ».
| Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
|
| > Pourquoi cela devrait-il être étonnant ?
|
| Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis
| « Ah, finalement, non ».
Pas du tout.
Si tu déclares un *objet* const, alors tu es obligé de
l'initialiser à sa création et tu ne peux pas changer son état (sauf
s'il comporte de sous-objets « mutable », auquel cas, tu peux utiliser
const_cast<> pour modifier ces parties là). Autrement, ça peut faire
boom.
Si tu as un pointeur de type « const T* », tu ne dis pas que
l'objet pointé est « constant ». Non. Tu dis simplement que le
pointeur tel quel ne peut pas être directement utilisé pour
potentiellement modifier l'état de l'objet pointé. En fait, tu dis
« l'objet pointé est *peut-être* constant, mais ce n'est pas sûr å
100%, et dans le cas où il n'est pas en réalité constant, je veux
faire cette modification-ci, avec const_cast<> ».
Pareil avec un « const T& ».
| Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est
| utile, on est d'accord.
Je ne parlais pas de cas d'utilité, mais de la manière dont tu décris
« const » et « const_cast ».
| Gabriel Dos Reis writes: | | > Pourquoi cela devrait-il être étonnant ? | | Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis | « Ah, finalement, non ».
Pas du tout.
Si tu déclares un *objet* const, alors tu es obligé de l'initialiser à sa création et tu ne peux pas changer son état (sauf s'il comporte de sous-objets « mutable », auquel cas, tu peux utiliser const_cast<> pour modifier ces parties là). Autrement, ça peut faire boom.
Si tu as un pointeur de type « const T* », tu ne dis pas que l'objet pointé est « constant ». Non. Tu dis simplement que le pointeur tel quel ne peut pas être directement utilisé pour potentiellement modifier l'état de l'objet pointé. En fait, tu dis « l'objet pointé est *peut-être* constant, mais ce n'est pas sûr å 100%, et dans le cas où il n'est pas en réalité constant, je veux faire cette modification-ci, avec const_cast<> ».
Pareil avec un « const T& ».
| Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est | utile, on est d'accord.
Je ne parlais pas de cas d'utilité, mais de la manière dont tu décris « const » et « const_cast ».
-- Gaby
Matthieu Moy
Gabriel Dos Reis writes:
Pourquoi cela devrait-il être étonnant ?
Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis « Ah, finalement, non ».
Avec « private », tu dis « Les autres ne peuvent pas toucher à ça ». Je ne trouverais pas étonnant qu'il y ai un truc qui permette de dire « Ah, finalement, si ». C'est tout.
Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est utile, on est d'accord.
-- Matthieu
Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
Pourquoi cela devrait-il être étonnant ?
Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis
« Ah, finalement, non ».
Avec « private », tu dis « Les autres ne peuvent pas toucher à ça ».
Je ne trouverais pas étonnant qu'il y ai un truc qui permette de dire
« Ah, finalement, si ». C'est tout.
Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est
utile, on est d'accord.
Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis « Ah, finalement, non ».
Avec « private », tu dis « Les autres ne peuvent pas toucher à ça ». Je ne trouverais pas étonnant qu'il y ai un truc qui permette de dire « Ah, finalement, si ». C'est tout.
Ca ne veut pas dire qu'il n'y a pas des cas ou le const_cast est utile, on est d'accord.
-- Matthieu
Loïc Joly
Matthieu Moy wrote:
Gabriel Dos Reis writes:
Pourquoi cela devrait-il être étonnant ?
Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis « Ah, finalement, non ».
Plus présisément, tu dis : Même si la façon dont j'ai accès à l'onjet prétend que l'objet est constant, je sais que ce n'est pas vraiment le cas et que l'objet a été créé variable. Donc je vais le rappeler au programme.
-- Loïc
Matthieu Moy wrote:
Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
Pourquoi cela devrait-il être étonnant ?
Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis
« Ah, finalement, non ».
Plus présisément, tu dis : Même si la façon dont j'ai accès à l'onjet
prétend que l'objet est constant, je sais que ce n'est pas vraiment le
cas et que l'objet a été créé variable. Donc je vais le rappeler au
programme.
Avec const, tu dis « Ca, c'est constant ». Avec const_cast, tu dis « Ah, finalement, non ».
Plus présisément, tu dis : Même si la façon dont j'ai accès à l'onjet prétend que l'objet est constant, je sais que ce n'est pas vraiment le cas et que l'objet a été créé variable. Donc je vais le rappeler au programme.