Color32 operator = (color32 A,int X) must be a non-static [Résolu]

Signaler
Messages postés
24
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
9 novembre 2005
-
Messages postés
24
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
9 novembre 2005
-
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++!

Merci d'avance pour votre aide!

14 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Un fonction statique est une fonction qui ne s'applique pas à un objet
particulier (cela implique qu'il n'y a pas de ptr this dans ces
méthodes).

Normalement ca devrait ressembler à ca:

color32& color32::operator=(const color32& clr)

{

if(&clr != this) // le même objet, on ne fait rien

{

value32 = clr.value32;

}

return *this;

}

ici this représente ce qu'il y a à gauche du =
Messages postés
24
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
9 novembre 2005

ok merci :)



Bon c'etait pas une classe parcontre, j'ai donc du virer color32:: mais j'ai compris le probleme ^_^
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
C'est quoi alors si c'est pas une classe?
Messages postés
24
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
9 novembre 2005

Héhé structure union, je pensé pas qu'on pouvais tout betement faire struct1 = struct2... pour les unions :-)


Je debute, et ça se voit! :-)



Finalement mon probleme n'etait pas ^_^
Mais je retient ton code pour les classes!



anKh.
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

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".
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Et a quoi peut bien servir un operator= s'il ne fait pas partie d'une classe? Tu as un exemple?
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

Bon, toutes mes excuses, les opérateurs =, [], () et -> doivent obligatoirement appartenir à une classe ou être amis (friend) avec.

Bon sinon définir un opérateur en dehors d'une classe a qd même son utilité.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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)
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

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.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Ca marche parce que ofstream a défini l'opérateur <<, non? Je suis pas trop sur, mais je pense que tu te trompes la

cout est un objet de je ne sais quelle classe (un ostream en gros), et
tu fais (cout.operator<<(a)).operator<<(endl);
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

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...
Messages postés
24
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
9 novembre 2005

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
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

ben tu peux pas definir ton operator= dans l'union comme s'il s'agissait d'une classe ?
Messages postés
24
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
9 novembre 2005

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!