Color32 operator = (color32 A,int X) must be a non-static

Résolu
anykey Messages postés 24 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 9 novembre 2005 - 29 mai 2005 à 12:01
anykey Messages postés 24 Date d'inscription mercredi 6 avril 2005 Statut Membre Derniè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++!

Merci d'avance pour votre aide!

14 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 mai 2005 à 13:55
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 =
3
anykey Messages postés 24 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 9 novembre 2005
29 mai 2005 à 14:10
ok merci :)



Bon c'etait pas une classe parcontre, j'ai donc du virer color32:: mais j'ai compris le probleme ^_^
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
29 mai 2005 à 15:53
C'est quoi alors si c'est pas une classe?
0
anykey Messages postés 24 Date d'inscription mercredi 6 avril 2005 Statut Membre Dernière intervention 9 novembre 2005
29 mai 2005 à 21:55
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
30 mai 2005 à 09:44
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".
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mai 2005 à 10:55
Et a quoi peut bien servir un operator= s'il ne fait pas partie d'une classe? Tu as un exemple?
0
Utilisateur anonyme
30 mai 2005 à 15:14
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é.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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)
0
Utilisateur anonyme
30 mai 2005 à 15:47
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
30 mai 2005 à 16:27
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);
0
Utilisateur anonyme
30 mai 2005 à 18:48
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...
0
anykey Messages postés 24 Date d'inscription mercredi 6 avril 2005 Statut Membre Derniè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
0
Utilisateur anonyme
31 mai 2005 à 13:40
ben tu peux pas definir ton operator= dans l'union comme s'il s'agissait d'une classe ?
0
anykey Messages postés 24 Date d'inscription mercredi 6 avril 2005 Statut Membre Derniè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!
0
Rejoignez-nous