Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1246 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Operator= et membres constants

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Operator= et membres constants

n°1286199
caddie
Posté le 17-01-2006 à 23:39:10  profilanswer
 

Bonjour à tous,
Voici un problème auquel je n'arrive pas a trouver de réponse:
je possède une classe A

Code :
  1. class A {
  2. public:
  3. A(const std::string &une_chaine) : une_chaine_constante(une_chaine) {};
  4. A(const A& );
  5. A& operator=(const A& );
  6. ~A();
  7. private:
  8. const std::string une_chaine_constante;
  9. };


 
je dispose dans une autre classe d'un vector du type vector<A>.
Ma méthode d'ajout dans le vector d'un objet A est :  

Code :
  1. bool ajout(const &std::string une_chaine)
  2. {
  3. A a(une_chaine);
  4. mon_vector.push_back(a);
  5. }


 
Or c'est là ou intervient mon problème :
Le vector désire visiblement utiliser l'operator= pour effectuer la copie dans le vecteur.
Ceci ne posserait pas de problème si je n'avais pas ce terme constant "une_chaine_constante" que l'operator= ne peut pas toucher.
je ne sais donc pas comment réécrire cet opérateur  
selon ce que je trouve il faudrait une méthode du genre

Code :
  1. A& A::operator=(const A& a)
  2. {
  3. if(this!=a)
  4. {
  5. ....
  6. }
  7. return *this;
  8. }


Mais je ne sais pas comment bien l'écrire afin que vector accepte que je fasse un push_back de A ......
Merci par avance.
Caddie


Message édité par caddie le 18-01-2006 à 13:49:24
mood
Publicité
Posté le 17-01-2006 à 23:39:10  profilanswer
 

n°1286215
++fab
victime du syndrome IH
Posté le 18-01-2006 à 00:20:42  profilanswer
 

réponse simple : le constructeur de copie, l'operateur d'affectation, le constructeur, n'ont pas besoin d'etre déclaré dans ton cas. Ils le seront implicitement, et seront définis de la bonne manière le cas échéant.
Laisse faire le compilateur, soit faignant/productif.

n°1286216
slash33
Posté le 18-01-2006 à 00:25:29  profilanswer
 

Pour moi l'ensemble d'instructions :

Code :
  1. bool ajout(const std::string une_chaine)
  2. {
  3. A a(une_chaine);
  4. mon_vector.push_back(a);
  5. }


induit l'appel implicite au constructeur de copie de A.
 
Ne faudrait-il pas définir le constructeur de copie

A(const A& );


comme ceci:
 

Code :
  1. A(const A& obj)
  2. :une_chaine_constante(obj.une_chaine_constante)
  3. {
  4. }


 
?
 
Edit : fab m'a devancé pendant que j'écrivais. Voir si ce que je propose fonctionne.


Message édité par slash33 le 18-01-2006 à 00:27:55
n°1286258
caddie
Posté le 18-01-2006 à 08:34:45  profilanswer
 

J'avais laissé mon compilo (VC7) faire, mais a la compilation il me crache a la gueule en me disant :  
"error C2582: 'operator =' fonction non disponible dans 'A' ' et ceci de me remener au fichier xutility
Cette erreur disparaissant si j'enlève le push_back.

n°1286264
chrisbk
-
Posté le 18-01-2006 à 08:52:49  profilanswer
 

pas trop grand chose a voir, mais :
 

Code :
  1. bool ajout(const std::string une_chaine)


 
passe plutot ton param par reference (jpense c'est un oubli / recopie foireuse, mais bon)

n°1286503
caddie
Posté le 18-01-2006 à 12:58:16  profilanswer
 

chrisbk a écrit :

pas trop grand chose a voir, mais :
 

Code :
  1. bool ajout(const std::string une_chaine)


 
passe plutot ton param par reference (jpense c'est un oubli / recopie foireuse, mais bon)


 
Oui ça c'est juste une erreur en écrivant sur le forum

n°1286516
push
/dev/random
Posté le 18-01-2006 à 13:24:11  profilanswer
 

caddie a écrit :

"error C2582: 'operator =' fonction non disponible dans 'A' ' et ceci de me remener au fichier xutility
Cette erreur disparaissant si j'enlève le push_back.

T'es sur de l'avoir enlevé ton A& operator=(const A& );  ?

n°1286554
caddie
Posté le 18-01-2006 à 13:50:57  profilanswer
 

push a écrit :

T'es sur de l'avoir enlevé ton A& operator=(const A& );  ?


 
 
 
Oui quand j'ai ce message d'erreur, je n'ai aucune redéfinition d'opérateur ni du constructeur par copie dans ma classe A.
Il se trouve que si j'enlève le const de ma chaine de la classe A alors le push_back fonctionne. Le problème c'est que j'aimerai que ma chaine membre de la classe A reste constante ...

n°1286588
push
/dev/random
Posté le 18-01-2006 à 14:17:27  profilanswer
 

ouaip, t'es obligé de redéfinir l'opérateur d'affectaction

n°1286589
chrisbk
-
Posté le 18-01-2006 à 14:19:13  profilanswer
 

caddie a écrit :

Le problème c'est que j'aimerai que ma chaine membre de la classe A reste constante ...


 
pkoi ? elle est private, non partagé, donc bon...

mood
Publicité
Posté le 18-01-2006 à 14:19:13  profilanswer
 

n°1286600
push
/dev/random
Posté le 18-01-2006 à 14:28:10  profilanswer
 

chrisbk> tiens sûrement question con mais pq vector utilise l'operateur d'affectation et pas le constructeur de recopie au moment du push_back ? ça résoudrait le problème du const là non ? enfin je dis ça je sais même pas à quoi ressemble vector

n°1286623
caddie
Posté le 18-01-2006 à 14:45:44  profilanswer
 

push a écrit :

chrisbk> tiens sûrement question con mais pq vector utilise l'operateur d'affectation et pas le constructeur de recopie au moment du push_back ? ça résoudrait le problème du const là non ? enfin je dis ça je sais même pas à quoi ressemble vector


 
Exactement la question que je me pose aussi.... parce que du coup je l'ai dans l'os mon truc.
Mais Chrisbk tu as raison je vais pas le mettre en const et au moins ca réglera le problème.

n°1286641
chrisbk
-
Posté le 18-01-2006 à 14:56:32  profilanswer
 

push a écrit :

chrisbk> tiens sûrement question con mais pq vector utilise l'operateur d'affectation et pas le constructeur de recopie au moment du push_back ? ça résoudrait le problème du const là non ? enfin je dis ça je sais même pas à quoi ressemble vector


 
ouais je sais pas trop non plus, chui pas allé voir en detail. J'imagine que vector s'alloue un tableau privé pour stocker les elements (cf la fonction reserve()) et que quand tu fais push_back il fait (grosso merdo) un truc genre :
 
tableau[size] = machin;
size++;
 

n°1286787
skelter
Posté le 18-01-2006 à 17:12:31  profilanswer
 

pas forcement, vector possede une zone alouée et à l'interieur de celle-ci une zone construite donc ca doit  plutot etre une reallocation si necessaire et une construction par placement new (avec size++), enfin ca doit dependre de l'implementation
 
moi ce que je trouves bizarre c'est que si un membre est constant alors la sémantique de opérateur = fournie par le compilateur devient illégale
faut donc dans ce cas le redefinir et dire qu'il ne fais rien (dans ce cas)
A& operator=(const A& ) { return *this; }

n°1286888
slash33
Posté le 18-01-2006 à 18:22:04  profilanswer
 

skelter a écrit :

faut donc dans ce cas le redefinir et dire qu'il ne fais rien (dans ce cas)
A& operator=(const A& ) { return *this; }


Et se retrouver avec une zone mémoire non initialisée ?

n°1286996
++fab
victime du syndrome IH
Posté le 18-01-2006 à 19:40:17  profilanswer
 

Tiens, la "chaine constante" a maintenant son const. L'ennui, c'est qu'une classe qui contient une donnée membre const non static, n'est pas assignable.  
Les séquences standards requierent au type de leur paramètre générique, d'etre copie-constructible et assignable. (les contraintes des templates ne peuvent, pour l'instant, pas etre exprimé élégamment, mais ça va venir).
 
donc, soit tu enleves le const, soit tu ajoutes un static ...


Message édité par ++fab le 18-01-2006 à 19:41:26
n°1287132
chrisbk
-
Posté le 18-01-2006 à 21:30:05  profilanswer
 

bin enlever le const, paske bon, static ca change un peu pas mal de chose [:god]

n°1288875
chicotruss
Posté le 21-01-2006 à 13:20:53  profilanswer
 

pour affecter une variable const non static moi j'utiliserai:
 
 
const_cast<std::string&>(une_chaine_constante) = une_chaine;

n°1288885
Taz
bisounours-codeur
Posté le 21-01-2006 à 13:34:32  profilanswer
 

mais arrêtez vos bêtises. soit c'est constant, soit ça l'est pas bordel. si tu marques t'as chaine const et qu'apres tu veux la modifier, ben elle est pas const c'est tout putain.

n°1288889
push
/dev/random
Posté le 21-01-2006 à 13:47:49  profilanswer
 

bein à la base y voulait juste stocker ses objets dans un vector

n°1288891
chrisbk
-
Posté le 21-01-2006 à 13:49:58  profilanswer
 

chicotruss a écrit :

pour affecter une variable const non static moi j'utiliserai:
 
 
const_cast<std::string&>(une_chaine_constante) = une_chaine;


 
nan bin nan, alors si c'est pour faire ca la marque pas const quoi [:el g]

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Operator= et membres constants

 

Sujets relatifs
[RESOLU] Initialisation des membres par défautSupprimer en masse des membres forum phpbb
Faire un site avec des membreserror C2274: '->' : illegal as right side of '.' operator
prob acces membres de classes pour fichier inclus en path absolusurcharge operator<<
Faire des membres d'une classe en "lecture seule"C++ operator << pour les ofstream
[c++] Bool operator < 
Plus de sujets relatifs à : Operator= et membres constants


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR