operateur d'affectation

operateur d'affectation - C++ - Programmation

Marsh Posté le 26-07-2008 à 12:15:57    

Salut à tous,
 
j'ai un petit problème de compilation avec mon code :
 

Code :
  1. class Force
  2. {
  3.       public:
  4.       ...
  5.       Force &operator=(const Force &F)
  6.       {
  7.             k=F.k;
  8.             return *this;
  9.       }   
  10. };
  11. main
  12. {
  13.       Force A;
  14.       Force B;
  15.       A=B;               //erreur ici.
  16. };


 
Lors de la compilation j'ai le droit à :
-C:\Documents and Settings\info\Bureau\sources\physic.cpp no match for 'operator=' in 'A = B'
-note C:\Documents and Settings\info\Bureau\sources\physic.h:30 candidates are: Force& Force::operator=(const Force& )
 
Voilà Merci d'avance pour vos réponses A+
 

Reply

Marsh Posté le 26-07-2008 à 12:15:57   

Reply

Marsh Posté le 26-07-2008 à 12:59:27    

Indice: regarder de plus près la ligne pour l(opérateur d'affectation, et essayer d'expliquer comment le compilateur pourrait en tirer la substantifique moelle.
 
Indice 2: l'espace est aussi vital en c++ (début de godwin).

Reply

Marsh Posté le 26-07-2008 à 14:09:38    

c'est quoi ce 'main()' ...
 
donne du code compilable.
 
et vérifie que A = A ne fait rien (if (this != &other) ...)

Reply

Marsh Posté le 26-07-2008 à 15:40:02    

Merci à toi Taz enfaite je crois que j'ai trouvé.
 

Code :
  1. class Force
  2. {
  3.       public:
  4.       ...
  5.       Force &operator=(const Force &F)
  6.       {
  7.             k=F.k;
  8.             return *this;
  9.       } 
  10. };
  11. void Simulation::Ajoute_Force(Force *F);
  12. {
  13.        Force B;
  14.        B=F;
  15. }


 
Le problème se situait au niveau du pointeur. Finalement j'ai remplacé le pointeur par une référence et ça fonctionne.
 
C'est normal que ça fonctionne pas par pointeur?
 
Merci encore A+

Reply

Marsh Posté le 26-07-2008 à 17:38:32    

non, le problème vient du fait que ta classe ne respecte pas la forme canonique de coplien et gère mal sa mémoire. Un membre référence c'est la porte ouverte au coup de kalashnikov dans le genou :o

Reply

Marsh Posté le 26-07-2008 à 18:18:09    

Taz a écrit :

vérifie que A = A ne fait rien (if (this != &other) ...)


 
Si ce test est nécessaire, ton opérateur d'affectation n'est vraisemblablement pas exception safe.
 

Joel F a écrit :

non, le problème vient du fait que ta classe ne respecte pas la forme canonique de coplien et gère mal sa mémoire. Un membre référence c'est la porte ouverte au coup de kalashnikov dans le genou :o


 
Avec ce qu'il donne, j'ai dû mal à voir comment tu déduis cela; j'ai pas vu la moindre indication sur le type de k.
 

katmai a écrit :

Code :
  1. void Simulation::Ajoute_Force(Force *F);
  2. {
  3.        Force B;
  4.        B=F;
  5. }


 
Le problème se situait au niveau du pointeur. Finalement j'ai remplacé le pointeur par une référence et ça fonctionne.
 
C'est normal que ça fonctionne pas par pointeur?


 
Oui, c'est normal que tu ne puisses pas assigner un pointeur vers la classe à une instance de la classe.

Message cité 2 fois
Message édité par Un Programmeur le 26-07-2008 à 18:46:13
Reply

Marsh Posté le 26-07-2008 à 18:42:45    

si ton nouveau code compile, c'est que tu n'as pas surchargé que l'opérateur que tu nous indique ...
Qui plus est, tu n'as pas tenu compte de la remarque de Taz
 
Edit : note pour plus tard, penser à raffraichir la page de temps en temps


Message édité par theshockwave le 26-07-2008 à 18:43:59
Reply

Marsh Posté le 26-07-2008 à 19:08:28    

Un Programmeur a écrit :


 
Si ce test est nécessaire, ton opérateur d'affectation n'est vraisemblablement pas exception safe.
 

moi y en a pas voir le rapport.

Reply

Marsh Posté le 26-07-2008 à 19:13:07    

J'imagine qu'il parle des exceptions qu'on pourrait involontairement lever si on ne gère pas l'auto affectation.
 
En même temps, c'est à peu près aussi concis que le premier post, donc bon...

Reply

Marsh Posté le 26-07-2008 à 19:31:20    

Taz a écrit :

moi y en a pas voir le rapport.


 
http://www.gotw.ca/gotw/011.htm, mais il me semblait que la discussion était plus étendue sur ce point.  Peut-être
est-ce le cas dans le bouquin, mais je ne l'ai pas sous la main.

Reply

Marsh Posté le 26-07-2008 à 19:31:20   

Reply

Marsh Posté le 26-07-2008 à 20:20:38    

"Short answer: Technically, it's neither necessary nor sufficient. In practice it's probably fine and may even be fixed in the standard."
 
L'argument exception-safe je ne le comprends pas. p1 = p2 c'est exception-safe, mais faire un double delete, ça pose un problème bien différent. D'ailleurs, l'operator= synthétisé par le compilateur pour un POD, il est bien exception-safe, mais il risque de ne pas avoir la bonne sémantique sur des pointeurs.

Reply

Marsh Posté le 26-07-2008 à 20:41:54    

Un Programmeur a écrit :


Avec ce qu'il donne, j'ai dû mal à voir comment tu déduis cela; j'ai pas vu la moindre indication sur le type de k.


 
l'expérience des postes de ce style ou le gugus ne fournit pas les constructeurs/operator= qui vont bien alors que sa classe contient pas que des POD :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed