OVH Cloud OVH Cloud

opérateur de conversion et constructeur de copie

3 réponses
Avatar
Marc
J'ai un problème tout bête

une classe possède un constructeur de copie et un opérateur de conversion
sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur
virtuel donc obligatoire)

ClassA(const ClassA&);
virtual operator const ClassA(void) const;
virtual operator ClassA(void) ;
// opérateur + redéfini
Maintenant je fais

ClassA x;
ClassA y;
ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y
a ambiguîté entre la conversion de type et le constructeur de copie.

Si je fais
ClassA z;
z=x+y;
c'est bon...

Comment faire ?

Marc

3 réponses

Avatar
drkm
"Marc" writes:

une classe possède un constructeur de copie et un opérateur de conversion
sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur
virtuel donc obligatoire)

ClassA(const ClassA&);
virtual operator const ClassA(void) const;
virtual operator ClassA(void) ;


La déclarer privée, sans l'implémenter, ne serait-il pas plus
satisfaisant, dans ce cas (je ne connais pas tous les tenants et
aboutissants) ?

// opérateur + redéfini
Maintenant je fais

ClassA x;
ClassA y;
ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y
a ambiguîté entre la conversion de type et le constructeur de copie.


Et avec :

Class z( x + y ) ;

?

--drkm

Avatar
kanze
"Marc" wrote in message
news:<417ec0e1$0$25701$...

J'ai un problème tout bête

une classe possède un constructeur de copie et un opérateur de
conversion sur elle_même (ça paraît idiot mais il s'agit d'une
redéfinition d'opérateur virtuel donc obligatoire)

ClassA(const ClassA&);
virtual operator const ClassA(void) const;
virtual operator ClassA(void) ;
// opérateur + redéfini
Maintenant je fais

ClassA x;
ClassA y;
ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y
a ambiguîté entre la conversion de type et le constructeur de copie.


Ce qui me semble une erreur. La règle ici, c'est :

1. On évalue l'expression d'initialisation.
2. On le convertit en type voulu (c-à-d ici ClassA).
3. On appelle le constructeur de copie pour initialiser la variable.

Or, si l'opérateur + renvoie une ClassA, la conversion en 2 est
triviale. On n'appelle pas un opérateur de conversion quand on a déjà le
bon type. Et si l'opérateur + renvoie autre chose, il faut le convertir
en ClassA -- la conversion ne doit pas être ambigüe, mais le
constructeur de copie n'entre pas en jeu.

Ensuite, en 3, c'est le constructeur de copie qui entre en jeu. Et
seulement le constructeur de copie -- rien d'autre. (Ensuite, le
compilateur a le droit de supprimer la copie, s'il veut. Mais l'analyse
de la légalité ne tient pas compte de cette suppression.)

--
James Kanze GABI Software http://www.gabi-soft.fr
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
Marc
Eh oui, il me semble bien que ce soit mon compilo qui déconne sur ce
point...
Effectivement, le type de retour de x+y n'est pas forcément ClassA dans mon
cas, mais je ne comprends pas pourquoi il n'appelle pas dans tous les cas
le constructeur de copie, éventuellement après une conversion...
D'autant que je ne peux pas éviter le problème en redéfinissant l'opérateur
=, qui lui n'est jamais appelé, comme il se doit...
Tu sais pas si il y a des paramètrages de compilation sur ce point ?
J'utilise C++ Builder 6...
Marc