anykey
Messages postés24Date d'inscriptionmercredi 6 avril 2005StatutMembreDernière intervention 9 novembre 2005
-
29 mai 2005 à 12:01
anykey
Messages postés24Date d'inscriptionmercredi 6 avril 2005StatutMembreDernière intervention 9 novembre 2005
-
1 juin 2005 à 12:54
Salut a tous, j'ai un soucis avec les operator c++
color32 operator = (color32 A,int X)
{
color32 ret;
ret.value32=X;
return ret;
}
Il ne veut pas compiler, pretextant que
"color32 operator = (color32 A,int X) must be a non-static"
Et euuh comment dire, la notion de static non static je connais pas trop en c++!
De plus la surcharge d'opérateurs doit respecter une certaine signature et une certaine sémantique.
Bon pour l'aspect sémantique (= sens à comprendre) on s'en balance un peu, le compilo n'y verra que du feu, mais le code sera très chelou.
Par contre pour la signature, faut respecter ca:
Objet& Objet::operator=(const Objet&);
ie: Objet en retour, Objet appelant, Obnjet en affectation // cas où on est dans une classe / struct / union
sinon Objet operator=(Objet, Objet); Si on est hors d'une classe.
Je veux dire qu'on a pas le droit d'affecter un "objet virgule un int" à un "objet".
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 30 mai 2005 à 15:28
Oui même ca ca m'intéresse, parce que ve vois pas comment on peut
définir un opérateur en dehors d'une classe, puisque pour l'opérateur
T, a T b signifie a.T(b)
oui, mais regarde, pour cout par exemple (qui est un ostream)
on surcharge << en dehors de la classe ostream (sinon il faudrait changer le code à chaque fois)
exemple pour les complexes:
struct Complexe {
float real;
float img;
};
ostream& operator<<(ostream& os, Complexe a) {
os << a.real << " + " << a.img << "i";
return os;
}
Ensuite tu peux utiliser l'opération "<< a" où a est un complexe aussi bien sur des flux de fichiers (ofstream qui dérive de ostream) que sur des ostream (cout et err les seuls me semble-t-il).
cout << a << endl;
Voilà, ca permet d'étendre les fonctionnalités sans retaper la classe ni dériver.
Comme le montre ce joli dessin, ofstream descend bien de ostream.
Tel que j'ai défini ma surcharge de l'opérateur << pour les ostream(s), celà fonctionne pour TOUT les ostream, donc y compris les ofstream (fichiers).
cout est une instance de la class ostream, donc on peut utiliser ma surcharge dessus.
De toute façon éssaie le code avec et sans et tu verras bien qu'il faut que la surcharge soit faite pour que ca marche.
Sinon, bien sur que ofstream a défini operator<<, mais il ne marche pas pour les Complexe (puisqu'ils n'existent pas encore). En fait on a melé polynorphisme (plusieurs fonctions différentes avec même nom mais arg différents) et surcharge (étendre ou modifier la fonctionnalité de l'opérateur).
Bref, dslé pour le blabla, mais je comprenais pas ce que t'entendais par ta première phrase. Alors j'ai blablaté tout ca, la réponse doit être dedans...
anykey
Messages postés24Date d'inscriptionmercredi 6 avril 2005StatutMembreDernière intervention 9 novembre 2005 31 mai 2005 à 10:51
Et a quoi peut bien servir un operator= s'il ne fait pas partie d'une classe? Tu as un exemple?
Bah en fait j'ai une classe union
union Color32
{
struct
{ char R,G,B,A }; Value8
int Value32;
}
puis dans un exemple:
passer directement le parametre Color32.value32 par defaut lorsqu'on fait
Color32 col = 0xFFFFFFFF;
Enfin j'ai utiliser une fonction de transtypage IntToColor32, mais bon
j'aurai bien aimé passer outre, il doit y avoir une methode mais je ne
suis pas sur! :P
anykey
Messages postés24Date d'inscriptionmercredi 6 avril 2005StatutMembreDernière intervention 9 novembre 2005 1 juin 2005 à 12:54
Waaa je sais pas je comprend pas trop ^_^
Tu n'a pas un exemple concret?
Et c'est bien plus simple en delphi! :P suffit de rajouté default a la
fin d'une declaration dans une classe pour que Classe:=Int par exemple
bah sa marche!