Gestion de l'assignation consanguine
  Home FAQ Contact Sign in
fr.comp.lang.c++ only
 
Advanced search
POPULAR GROUPS

more...

fr.comp.lang.c++ Profile…
 Up
Gestion de l'assignation consanguine         


Author: Mickaël Wolff
Date: Apr 29, 2008 17:59

Bonjour,

Si on a les trois classes suivantes :

class A
{
public:
virtual A & operator=(A const & rvalue) ;

/* ... */
} ;

class B0 : public A
{
public:
virtual A & operator=(B0 const & rvalue) ;
/* ... */
} ;
Show full article (1.04Kb)
8 Comments
Re: Gestion de l'assignation consanguine         


Author: Sylvain SF
Date: Apr 29, 2008 18:31

Mickaël Wolff wrote on 30/04/2008 02:59:
>
> class A {
> public:
> virtual A & operator=(A const & rvalue) ;
> } ;
>
> class B0 : public A {
> public:
> virtual A & operator=(B0 const & rvalue) ;
> } ;
>
> class B1 : public A {
> public:
> virtual A & operator=(B1 const & rvalue) ;
> } ;
>
> B0 b0 ;
> B1 b1 ;
> A & b0_a = static_cast(b0) ; ...
Show full article (1.56Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: James Kanze
Date: Apr 30, 2008 01:06

On Apr 30, 2:59 am, Mickaël Wolff laposte.net> wrote:
> Si on a les trois classes suivantes :
> class A
> {
> public:
> virtual A & operator=(A const & rvalue) ;
> /* ... */
> } ;
> class B0 : public A
> {
> public:
> virtual A & operator=(B0 const & rvalue) ;
> /* ... */
> } ;
Show full article (6.69Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: Mickaël Wolff
Date: Apr 30, 2008 05:14

Sylvain SF a écrit :
> elle set impossible comme telle.
> B1 définit un operateur = avec B1& en paramètre, pas un A&

En fait si. En fait, B0::operator=(B0 const &) empêche la création
d'un operator= automatique. Un effet de bord est donc l'appel de
A::operator=(A const &) à l'affectation d'un A. C'est du moins le
comportement que j'observe avec gcc 4.3.0, et il ne me parait pas aberrant.
>> Lever une exception car c'est un non sens ? Et surtout, comment je le
>> détecte dans l'affectation ?
>
> si l'affectation est un non-sens, les operéateurs d'affectation
> devraient être privés pour éviter ces non-sens.

Effectivement, c'est une solution à envisager.
> si la perte signifie que l'instance sera caduque, interdissez les
> affectations; si les classes sont transposables (A = coordonnées,
> B0 = cartesiennes, B1 = polaires) offrez ces opérateurs et pourquoi
> pas un B0::operator= (B1 const&) (et vice-versa).

Merci pour ta réponse.
Show full article (1.20Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: James Kanze
Date: May 2, 2008 00:41

On Apr 30, 2:14 pm, Mickaël Wolff laposte.net> wrote:
> Sylvain SF a écrit :
>> elle set impossible comme telle. B1 définit un operateur =
>> avec B1& en paramètre, pas un A&
> En fait si. En fait, B0::operator=(B0 const &) empêche la
> création d'un operator= automatique. Un effet de bord est donc
> l'appel de A::operator=(A const &) à l'affectation d'un A.
> C'est du moins le comportement que j'observe avec gcc 4.3.0,
> et il ne me parait pas aberrant.

En fait, non. Tu ne trouves l'operator=( A const& ) que parce
que tu affectes à travers un A. Rappelons comment se passe les
choses :

-- Le compilateur recherche le nom (ici, operator=). Dans le
cas d'un opérateur, cette recherche est un peu spéciale,
parce qu'il considère à la fois des fonctions libres et des
fonctions...
Show full article (3.12Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: Mickaël Wolff
Date: May 6, 2008 17:02

James Kanze a écrit :
> Dans la pratique, tu dois te démander si ça a un sens. Au moins
> dans les applications que je fais, le polymorphisme s'applique
> surtout à des objets ayant une identité, et donc, qui ne
> supporte ni l'affectation ni la copie.

Qu'est-ce que tu appelles une identité ?
> class B0 : public A {
> {
> public:
> virtual B0& operator=( A const& other ) ;
> // ...
> } ;

Oui, en fait j'ai mal posé mes exemples. Finalement, dans le cas où
j'avais besoin d'affectations et de comparaisons virtuelles pour me
libérer de la nature des objets.
> (Que l'opérateur renvoie un B0& ou un A&, en revanche, n'a pas
> d'importance, puisque le C++ supporte les types de retour
> co-variants.)

Ça j'avais compris :)
Show full article (3.60Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: James Kanze
Date: May 7, 2008 01:02

On May 7, 2:02 am, Mickaël Wolff laposte.net> wrote:
> James Kanze a écrit :
>> Dans la pratique, tu dois te démander si ça a un sens. Au moins
>> dans les applications que je fais, le polymorphisme s'applique
>> surtout à des objets ayant une identité, et donc, qui ne
>> supporte ni l'affectation ni la copie.
> Qu'est-ce que tu appelles une identité ?

C'est qu'une opération sur un objet n'en vaut pas la même
opération sur un autre, même si la « valeur » est la même.
L'exemple typique (mais bien simplifié), c'est un compte en
banque, et une valeur qu'on y vire ou prélève. Le compte a une
identité ; faire la virement sur une copie de l'objet, ou un
autre objet qui a par hazard la même valeur ne va pas. La valeur
qu'on y vire ou prélève, en revanche, n'a pas d'identité : 100
Euros, c'est 100 Euros, que ce soit une copie ou non.
Show full article (6.32Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: Alexandre Abreu
Date: May 8, 2008 08:26

On May 7, 4:02 am, James Kanze gmail.com> wrote:
>
> En gros, la dérivée ne doit pas
> imposer des préconditions plus contraignantes, et doit garantir
> des postconditions au moins aussi fortes que la base.

Je ne veux pas "hijacker" le sujet mais juste une remarque a propos de
cette affirmation.
C'est qquechose qu'on entend souvent et qui est dit et repete quand on
parle de contrat / interface
et qu'on evoque differentes implementations de ce contrat dans le
temps.
Show full article (1.34Kb)
no comments
Re: Gestion de l'assignation consanguine         


Author: James Kanze
Date: May 9, 2008 00:51

On May 8, 5:26 pm, Alexandre Abreu gmail.com> wrote:
> On May 7, 4:02 am, James Kanze gmail.com> wrote:
>> En gros, la dérivée ne doit pas imposer des préconditions
>> plus contraignantes, et doit garantir des postconditions au
>> moins aussi fortes que la base.
> Je ne veux pas "hijacker" le sujet mais juste une remarque a
> propos de cette affirmation. C'est qquechose qu'on entend
> souvent et qui est dit et repete quand on parle de contrat /
> interface et qu'on evoque differentes implementations de ce
> contrat dans le temps.
> Par contre, c'est quelquechose qui m'a toujours plus ou moins
> derange (bien que je l'utilise de cette facon) car j'ai
> l'impression que tolerer des preconditions moins
> contraignantes et / ou des postconditions plus contraignantes
> brise le contrat d'une certaine facon. Je n'ai jamais encore
> pu accepter cette affirmation de but en blanc, peut etre parce
> qu'il me manque un element, je ne sais pas ...

Je suis en fait un peu de cet avis moi-même, que faire des
préconditions plus libérales ou des postconditions plus strictes
n'est pas vraiment dans le sens de la chose, au moins quand on
parle de l'aspect...
Show full article (3.48Kb)
no comments