OVH Cloud OVH Cloud

Passer outre les protections private/protected

13 réponses
Avatar
Matthieu Moy
Bonjour,

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 ;-)

Merci de vos réponses,

--
Matthieu

3 réponses

1 2
Avatar
Gabriel Dos Reis
Matthieu Moy writes:

| 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
Avatar
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

Avatar
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


1 2