OVH Cloud OVH Cloud

Supprimer "private"

54 réponses
Avatar
Fabien LE LEZ
Bonjour,

Soit une classe, avec un certain nombre de membres privés ou protégés,
dans un programme donné, terminé, qui fonctionne.

À cause d'un "friend" illégal[*], que gcc n'accepte pas, je souhaite
supprimer la ligne "friend XXX" et les "private:" et "protected:"[**].

Il me semble que cette modification ne changera pas le fonctionnement
du programme.

Quelqu'un pourrait-il confirmer ?

Merci d'avance.




[*] <http://www.comeaucomputing.com/techtalk/templates/#friendclassT>

[**] Oui, je sais, ce n'est pas forcément une idée géniale, mais comme
je ne compte pas pondre du code qui utilise directement ces classes,
je ne pense pas avoir besoin de la protection apportée par "private"
et "protected".

10 réponses

1 2 3 4 5
Avatar
Stan
"Bertrand Lenoir-Welter" a écrit dans le message
de news:43283b88$0$986$
|
| J'ai pas dit ça non plus. Seulement que la répartition public/private
| n'a de sens qu'à la compilation et plus aucun à l'exécution, et que son

Non.
Si tu utilises une hierarchie de classes ou tout est public,
tu as le risque d'avoir des gros pb à l'execution et ce sans
la moindre erreur de compilation.

Evidemment, tu as toujours le recours de mettre 3 lignes
de commentaire au dessus de chaque méthode pour
décrire la manière dont elle est censé être utilisé;
mais je pense que le compilateur est plus
performant pour détecter les anomalies.

--
-Stan
Avatar
Bertrand Lenoir-Welter
Fabien LE LEZ :

T GetValeur() const
{
assert (Ok());
return valeur;
}


Fabien, trouve un exemple où ce genre de code a un sens sérieux et
incontournable. Personnellement, j'écrirai jamais un truc comme ça.


Avec "private:", le compilateur le fait pour toi -- il n'y a pas moyen
d'utiliser cette classe de manière incorrecte sans générer une erreur.


T'es en train de me dire qu'un private te permet de ne pas te conduire
comme un abruti total. Certes, mais c'est très limité et ça ne
t'empêchera pas de commettre tes conneries plus loin. On est entre gens
sérieux, non ?

Avatar
Fabien LE LEZ
On Wed, 14 Sep 2005 18:14:49 +0200, Bertrand Lenoir-Welter
:

Fabien, trouve un exemple où ce genre de code a un sens sérieux et
incontournable.


<news:
<news:430c2560$0$18591$

Avatar
Fabien LE LEZ
On Wed, 14 Sep 2005 18:14:49 +0200, Bertrand Lenoir-Welter
:

T'es en train de me dire qu'un private te permet de ne pas te conduire
comme un abruti total.


J'avais des doutes sur le caractère trollatif de ton intervention ;
ils sont levés...

Avatar
Jean-Marc Bourguet
Fabien LE LEZ writes:

J'avais des doutes sur le caractère trollatif de ton intervention ;
ils sont levés...


Pour les trolls restez sur fr.comp.algorithmes SVP.

Merci.

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Bertrand Lenoir-Welter
Fabien LE LEZ :

J'avais des doutes sur le caractère trollatif de ton intervention ;
ils sont levés...


Avis d'orfèvre ?

Avatar
kanze
Fabien LE LEZ wrote:

Soit une classe, avec un certain nombre de membres privés ou
protégés, dans un programme donné, terminé, qui fonctionne.

À cause d'un "friend" illégal[*], que gcc n'accepte pas, je
souhaite supprimer la ligne "friend XXX" et les "private:" et
"protected:"[**].

Il me semble que cette modification ne changera pas le
fonctionnement du programme.

Quelqu'un pourrait-il confirmer ?


C'est au moins l'intention -- si un programme compile et
fonctionne correctement, supprimer tous les contrôles d'accès en
rendant tout public ne doit rien changer. (Note bien, par
exemple, que le « name binding » et la résolution du surcharge
ont lieu sans prendre en compte les contrôles d'accès. Je crois
que c'est pareil pour tout ce qui concerne les templates, mais
je m'y connais moins bien.)

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
kanze
Bertrand Lenoir-Welter wrote:
Fabien LE LEZ :

T GetValeur() const
{
assert (Ok());
return valeur;
}


Fabien, trouve un exemple où ce genre de code a un sens sérieux et
incontournable.


C'est un idiome (on dirait aujourd'hui un modèle de conception)
standard et répandu. Je crois que je n'ai jamais écrit une
application sans me servir de Fallible quelque part -- il sert
donc dans les noeuds principaux du reseau Deutsch Telekom, dans
des logiciels d'allocation des IP WAP pour T Mobil, dans la
gestion des ordres en Bourse...

Personnellement, j'écrirai jamais un truc comme ça.

Avec "private:", le compilateur le fait pour toi -- il n'y a
pas moyen d'utiliser cette classe de manière incorrecte sans
générer une erreur.


T'es en train de me dire qu'un private te permet de ne pas te
conduire comme un abruti total.


Il s'assure que tu ne fasses pas un type de bêtise. Il y a
toujours ça de gagner.

Certes, mais c'est très limité et ça ne t'empêchera pas de
commettre tes conneries plus loin.


Il n'y a pas de « silver bullet ». Mais des bêtises sont si vite
faites, il faut mettre tout de notre côté qu'on peut.

Réalistiquement, j'ai une expérience de plus de trente ans.
Avant de faire du C++, je faisais du C. J'écrivais des struct,
et une série de fonctions pour les manipuler, et je me croisais
les doigts que personne ne les manipule autrement que par mes
fonctions. Avec private, c'est le compilateur qui s'en occupe.
C'était, et ça reste, l'innovation la plus importante du C++ par
rapport au C.

Évidemment, il reste beaucoup d'autres bêtises à faire. Mais il
y a toujours ça de gagner.

On est entre gens sérieux, non ?


Je me le démande.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
kanze
Laurent Deniau wrote:
Bertrand Lenoir-Welter wrote:
A mon avis, les notions "public", "private" et "protected"
sont surtout utiles pour créer des librairies publiques ou
pour travailler en groupe. Pour un développeur seul sur un
projet, je trouve leur intérêt limité sinon nul, et j'ai
tendance à tout mettre public dans mes classes.

Ceci n'est que mon opinion, hein.

De toute façon, ces définitions ne servent qu'à la
compilation et au link. A l'exécution, il n'y a pas de
différence, du moins pas que je sache.


sauf dans l'heritage.


Même là, je crois. Les contrôles d'accès disparaissent après la
compilation, systèmatiquement. Les contrôles d'accès ne
s'appliquent qu'en dernier lieu par le compilateur, après le
« name binding » et la résolution du surcharge. Ils peuvent
rendre un programme illégal qui serait autrement légal, mais je
crois que leur effet s'arrêt là. Surtout, si un programme est
légal, et a une sémantique bien définie, je crois que rendre
tout public ne change rien.

Mais je me démande si tu ne faisais pas référence au
dynamic_cast -- un dynamic_cast respecte, en effet, les private,
et il se fait à l'exécution. Moi, je sais qu'en fait, il
travaille à partir des tables construites par le compilateur, et
que donc, la prise en compte des contrôles d'accès a lieu
uniquement dans le compilateur, lors de la construction de ces
tables. Mais c'est une particularité de l'implémentation, et je
conçois bien qu'un utilisateur moyen le considère comme un prise
en compte des contrôles d'accès lors de l'exécution.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Avatar
Laurent Deniau
kanze wrote:
Laurent Deniau wrote:

Bertrand Lenoir-Welter wrote:

A mon avis, les notions "public", "private" et "protected"
sont surtout utiles pour créer des librairies publiques ou
pour travailler en groupe. Pour un développeur seul sur un
projet, je trouve leur intérêt limité sinon nul, et j'ai
tendance à tout mettre public dans mes classes.




Ceci n'est que mon opinion, hein.




De toute façon, ces définitions ne servent qu'à la
compilation et au link. A l'exécution, il n'y a pas de
différence, du moins pas que je sache.




sauf dans l'heritage.


Mais je me démande si tu ne faisais pas référence au
dynamic_cast -- un dynamic_cast respecte, en effet, les private,
et il se fait à l'exécution. Moi, je sais qu'en fait, il


C'est a ca que je faisais reference et c'etait pour indiquer que dans le
cas de l'heritage, le comportement d'un programme peut changer si on
enleve/ajoute private.

a+, ld.



1 2 3 4 5