OVH Cloud OVH Cloud

operator = privee

34 réponses
Avatar
ricky
bonjour

j ai un petit probleme surement simpliste a resoudre ...

un code, que je ne peut pas toucher a un objet avec l operateur = en
private.

or un vieux code, qui marchait ecrivait : *toto=objet(valeur);

le complateur actuel indique : erreur - operator = private

Comment je peut reconduire elegement cete fonction ?

@+

PS : meilleurs voeux a tous

10 réponses

1 2 3 4
Avatar
fabien.chene
ricky writes:

j ai un petit probleme surement simpliste a resoudre ...


Ce n'est pas l'impression que ça me donne :-/

un code, que je ne peut pas toucher a un objet avec l operateur = en
private.


Si l'auteur de la classe a déclaré cet operator= privé, c'est
peut-être qu'il avait de bonnes raisons non ?

La classe était peut être sémantiquement non copiable, ou bien non
copiable par fainéantise d'avoir défini operator= et le constructeur
de copie, ou encore non copiable car c'est une mauvaise façon
d'utiliser cette classe, que sais-je ...

or un vieux code, qui marchait ecrivait : *toto=objet(valeur);

le complateur actuel indique : erreur - operator = private


Alors cela ressemble à un bug de l'ancien compilateur.

Comment je peut reconduire elegement cete fonction ?


Des compilateurs proposent des options pour désactiver l'effet des
spécificateurs d'accès « protected et private » au profit de
« public ». Voir la documentation de ton compilateur.

--
Fab

Avatar
James Kanze
Fabien Chêne wrote:

[...]
Des compilateurs proposent des options pour désactiver l'effet des
spécificateurs d'accès « protected et private » au profit de
« public ».


Quels compilateurs ? La distinction public/private est à la
base de C++ ; elle est plus ancienne encore que l'héritage. Il
existe bien des compilateurs qui ne font pas la distinction,
mais il ne supporte pas les fonctions membres non plus (qui
n'ont pas de sens sans cette distinction), et on les appelle des
compilateurs C.

--
James Kanze (Gabi Software) email:
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
Gabriel Dos Reis
"James Kanze" writes:

| Fabien Chêne wrote:
|
| [...]
| > Des compilateurs proposent des options pour désactiver l'effet des
| > spécificateurs d'accès « protected et private » au profit de
| > « public ».
|
| Quels compilateurs ? La distinction public/private est à la
| base de C++ ; elle est plus ancienne encore que l'héritage. Il
| existe bien des compilateurs qui ne font pas la distinction,
| mais il ne supporte pas les fonctions membres non plus (qui
| n'ont pas de sens sans cette distinction), et on les appelle des
| compilateurs C.

Oh.

:-)

-- Gaby
Avatar
fabien.chene
"James Kanze" writes:

Fabien Chêne wrote:

[...]
Des compilateurs proposent des options pour désactiver l'effet des
spécificateurs d'accès « protected et private » au profit de
« public ».


Quels compilateurs ?


Je répondrai au singulier GCC/g++ avec l'option -fno-access-control.
Mais j'imagine que cela doit bien exister pour d'autres compilateurs.

La distinction public/private est à la base de C++ ; elle est plus
ancienne encore que l'héritage. Il existe bien des compilateurs qui
ne font pas la distinction, mais il ne supporte pas les fonctions
membres non plus (qui n'ont pas de sens sans cette distinction), et
on les appelle des compilateurs C.


la documentation de cette option indique que c'est utilisé pour
contourner des bugs sur les spécificateurs d'accès, ni plus ni moins.

--
Fab


Avatar
James Kanze
Fabien Chêne wrote:
"James Kanze" writes:

Fabien Chêne wrote:

[...]
Des compilateurs proposent des options pour désactiver l'effet des
spécificateurs d'accès « protected et private » au profit de
« public ».


Quels compilateurs ?


Je répondrai au singulier GCC/g++ avec l'option -fno-access-control.
Mais j'imagine que cela doit bien exister pour d'autres compilateurs.


Ce n'est pas sûr.

La distinction public/private est à la base de C++ ; elle est plus
ancienne encore que l'héritage. Il existe bien des compilateurs qui
ne font pas la distinction, mais il ne supporte pas les fonctions
membres non plus (qui n'ont pas de sens sans cette distinction), et
on les appelle des compilateurs C.


la documentation de cette option indique que c'est utilisé pour
contourner des bugs sur les spécificateurs d'accès, ni plus ni moins.


Historiquement, g++ a eu des problèmes avec sa gestion de
contrôle d'accès -- de très anciennes versions permettaient
assez souvent des accès qui étaient intérdits. L'option est donc
sans doute motivée chez g++ par le désir de ne pas casser du
code (correct ou non) qui marchait avant. C'est compréhensible,
mais seulement chez g++, et seulement à cause des bugs dans
d'anciennes versions. (D'autres compilateurs en font autant pour
leurs bugs dans les anciennes versions.)

--
James Kanze (Gabi Software) email:
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
fabien.chene
"James Kanze" writes:

La distinction public/private est à la base de C++ ; elle est plus
ancienne encore que l'héritage. Il existe bien des compilateurs qui
ne font pas la distinction, mais il ne supporte pas les fonctions
membres non plus (qui n'ont pas de sens sans cette distinction), et
on les appelle des compilateurs C.


la documentation de cette option indique que c'est utilisé pour
contourner des bugs sur les spécificateurs d'accès, ni plus ni moins.


Historiquement, g++ a eu des problèmes avec sa gestion de
contrôle d'accès -- de très anciennes versions permettaient
assez souvent des accès qui étaient intérdits. L'option est donc
sans doute motivée chez g++ par le désir de ne pas casser du
code (correct ou non) qui marchait avant. C'est compréhensible,
mais seulement chez g++, et seulement à cause des bugs dans
d'anciennes versions.


Je trouverais également conpréhensible la présence de cette option si
les bugs venaient d'autres compilateurs massivement utilisés -- je
serais quand même bien étonné que GCC/g++ soit le seul compilateur à
avoir eu un jour un bug sur les contrôles d'accès.

--
Fab



Avatar
Gabriel Dos Reis
(Fabien Chêne) writes:

| "James Kanze" writes:
|
| >> > La distinction public/private est à la base de C++ ; elle est plus
| >> > ancienne encore que l'héritage. Il existe bien des compilateurs qui
| >> > ne font pas la distinction, mais il ne supporte pas les fonctions
| >> > membres non plus (qui n'ont pas de sens sans cette distinction), et
| >> > on les appelle des compilateurs C.
| >
| >> la documentation de cette option indique que c'est utilisé pour
| >> contourner des bugs sur les spécificateurs d'accès, ni plus ni moins.
| >
| > Historiquement, g++ a eu des problèmes avec sa gestion de
| > contrôle d'accès -- de très anciennes versions permettaient
| > assez souvent des accès qui étaient intérdits. L'option est donc
| > sans doute motivée chez g++ par le désir de ne pas casser du
| > code (correct ou non) qui marchait avant. C'est compréhensible,
| > mais seulement chez g++, et seulement à cause des bugs dans
| > d'anciennes versions.
|
| Je trouverais également conpréhensible la présence de cette option si
| les bugs venaient d'autres compilateurs massivement utilisés -- je
| serais quand même bien étonné que GCC/g++ soit le seul compilateur à
| avoir eu un jour un bug sur les contrôles d'accès.

La question n'est pas si aucun autre compilateur n'a pas eu de bugs en
ce qui concerne les contrôles d'accès.

Il serait interessant de calculer l'intersection des bugs des
compilateurs en matière de contrôle d'accès.

Je ne crois pas qu'il soit possible de comprendre GCC et ses options
juste en un prenant un cliché à un instant t fixé.

GCC est un logiciel en perpétuelle évolution (c'est ce qui arrive à la
plupart des logiciels qui ont du succès) et l'ensemble de ses
développeurs est également en perpétuelle évolution. Il en reste des
situations qu'on ne peut comprendre qu'à travers l'histoire.

-- Gaby
Avatar
ricky
bonjour

Des compilateurs proposent des options pour désactiver l'effet des
spécificateurs d'accès « protected et private » au profit de
« public ». Voir la documentation de ton compilateur.


oh j ai bien une solution generale : #define private public :-)
ok je sors ;)

Avatar
James Kanze
Fabien Chêne wrote:
"James Kanze" writes:

La distinction public/private est à la base de C++ ; elle est plus
ancienne encore que l'héritage. Il existe bien des compilateurs qui
ne font pas la distinction, mais il ne supporte pas les fonctions
membres non plus (qui n'ont pas de sens sans cette distinction), et
on les appelle des compilateurs C.


la documentation de cette option indique que c'est utilisé pour
contourner des bugs sur les spécificateurs d'accès, ni plus ni moi ns.


Historiquement, g++ a eu des problèmes avec sa gestion de
contrôle d'accès -- de très anciennes versions permettaient
assez souvent des accès qui étaient intérdits. L'option est donc
sans doute motivée chez g++ par le désir de ne pas casser du
code (correct ou non) qui marchait avant. C'est compréhensible,
mais seulement chez g++, et seulement à cause des bugs dans
d'anciennes versions.


Je trouverais également conpréhensible la présence de cette option si
les bugs venaient d'autres compilateurs massivement utilisés -- je
serais quand même bien étonné que GCC/g++ soit le seul compilateur à
avoir eu un jour un bug sur les contrôles d'accès.


Probablement pas, mais chez g++, ils étaient vraiment flagrants.

Ceci dit, le « bug » principal ne concernait que les types ;
les autres compilateurs que je connais ont appliqué les
contrôles d'accès aux types au même moment qu'ils ont appliqué
les règles de scope, plus ou moins. Tandis que pendant
longtemps, g++ ne les appliquait pas. En revanche, je ne crois
pas qu'il y a eu une version qui aurait accepté le code dans le
posting initial. (Je me démande d'où il provient, d'ailleurs. Je
n'ai jamais connu de compilateur qui l'aurait accepté.)

--
James Kanze (GABI Software) email:
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
James Kanze
Gabriel Dos Reis wrote:
(Fabien Chêne) writes:

| "James Kanze" writes:

| >> > La distinction public/private est à la base de C++ ; elle est pl us
| >> > ancienne encore que l'héritage. Il existe bien des compilateurs qui
| >> > ne font pas la distinction, mais il ne supporte pas les fonctions
| >> > membres non plus (qui n'ont pas de sens sans cette distinction), et
| >> > on les appelle des compilateurs C.

| >> la documentation de cette option indique que c'est utilisé pour
| >> contourner des bugs sur les spécificateurs d'accès, ni plus ni m oins.

| > Historiquement, g++ a eu des problèmes avec sa gestion de
| > contrôle d'accès -- de très anciennes versions permettaient
| > assez souvent des accès qui étaient intérdits. L'option est donc
| > sans doute motivée chez g++ par le désir de ne pas casser du
| > code (correct ou non) qui marchait avant. C'est compréhensible,
| > mais seulement chez g++, et seulement à cause des bugs dans
| > d'anciennes versions.

| Je trouverais également conpréhensible la présence de cette optio n si
| les bugs venaient d'autres compilateurs massivement utilisés -- je
| serais quand même bien étonné que GCC/g++ soit le seul compilateu r à
| avoir eu un jour un bug sur les contrôles d'accès.

La question n'est pas si aucun autre compilateur n'a pas eu de bugs en
ce qui concerne les contrôles d'accès.

Il serait interessant de calculer l'intersection des bugs des
compilateurs en matière de contrôle d'accès.

Je ne crois pas qu'il soit possible de comprendre GCC et ses options
juste en un prenant un cliché à un instant t fixé.


Tout à fait. Ce que j'ai écris doit se comprendre comme un
sommaire succinct et supérficiel, et non un analyse ni de
l'histoire détaillée. Pendant un certain temps, g++ n'enforçait
pas les contrôles d'accès sur des types membres, tandis que
d'autres compilateur le faisaient. Que ce soit la motivation de
l'option ou non, je ne sais pas -- c'est à mon avis une
explication plausible, mais certainement pas la seule possible.

GCC est un logiciel en perpétuelle évolution (c'est ce qui arrive à la
plupart des logiciels qui ont du succès) et l'ensemble de ses
développeurs est également en perpétuelle évolution. Il en reste des
situations qu'on ne peut comprendre qu'à travers l'histoire.


Tout à fait d'accord. Et cette histoire est en général assez
compliquée ; elle ne se laisse pas condenser en une phrase
simple.

Pour l'utilisateur, ce n'est pas toujours important. Ce qui
l'intéresse le plus, c'est l'état, et non comment on y est
arrivé. Le but de mon énoncée n'était pas de dire, c'est
exactement comme ça, mais simplement de rappeler que g++ a une
histoire, qui lui est propre, et que la présence de telle ou
telle option pourrait bien être le résultat de cette histoire,
et qu'il ne faut pas forcément s'attendre à en trouver une
option équivalente ailleurs. (Autant que je puisse déterminer
par les options « help », ni Sun CC ni VC++ ne l'ont, par
exemple.)

--
James Kanze (GABI Software) email:
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

1 2 3 4