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

  FORUM HardWare.fr
  Programmation
  C++

  [c++] operateur affectation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c++] operateur affectation

n°1729774
ffomnislas​h
Posté le 07-05-2008 à 23:01:52  profilanswer
 

:hello:  
 
Je delete/free plusieurs fois le même tableau et je ne comprend pas vraiment pourquoi. Le code est assez compliqué donc je vais essayer de résoudre le problème par élimination et j'aurait donc besoin d'un confirmation.
 
Voici ma classe:

Code :
  1. class Triangle
  2. {
  3. private:
  4. Proxy_Vertex3D p[3];
  5.         Edge* edge;
  6. public:
  7. Triangle();
  8.         ~Triangle();
  9.         Proxy_Vertex3D* get() ;
  10.         const Proxy_Vertex3D*  get_const() const;
  11.         Edge* get_edge() const;
  12.         Triangle &operator=(const Triangle & );
  13. };
  14. Triangle::Triangle()
  15. {
  16.     for(int i=0;i<3;i++)
  17.         p[i]=Proxy_Vertex3D();
  18.     edge = new Edge[3];
  19.     edge[0] = Edge(p[0],p[1]);
  20.     edge[1] = Edge(p[1],p[2]);
  21.     edge[2] = Edge(p[2],p[0]);
  22. }
  23. Triangle::~Triangle()
  24. {
  25.     delete[] edge;
  26. }
  27. Triangle &Triangle::operator=(const Triangle &t)
  28. {
  29.     if (&t != this)
  30.     {
  31.         edge = new Edge[3];
  32.         for(int i=0;i<3;i++)
  33.             edge[i] = t.get_edge()[i];
  34.         for(int i=0;i<3;i++)
  35.             p[i] = t.get_const()[i];
  36.     }
  37.     return *this;
  38. }
  39. Proxy_Vertex3D* Triangle::get()  {return p;}
  40. const Proxy_Vertex3D*  Triangle::get_const()  const{return p;}
  41. Edge* Triangle::get_edge() const {return edge;}


 
Etant donner que j'utilise un pointeur dans la classe, il faut que je le delete dans le destructeur. Il faut donc que je redeclare l'affectation pour faire une copie de ce tableau (edge). J'aimerait savoir si je m'y prend bien ?
Je précise que si j'utilise un pointeur et non pas un tableau fixe ou un vector c'est à cause d'un probleme d'utilisation croisé de classes.

mood
Publicité
Posté le 07-05-2008 à 23:01:52  profilanswer
 

n°1729779
in_your_ph​ion
Posté le 07-05-2008 à 23:26:19  profilanswer
 

si je dis pas de conneries, je dirais que dans ton opérateur =, il faut que tu testes si edge est vide et si oui faire un delete [] des anciennes données avant de copier les nouvelles.
Peut être que tu devrai faire un constructeur de copie également.

n°1729824
ffomnislas​h
Posté le 08-05-2008 à 08:47:44  profilanswer
 

in_your_phion a écrit :

si je dis pas de conneries, je dirais que dans ton opérateur =, il faut que tu testes si edge est vide et si oui faire un delete [] des anciennes données avant de copier les nouvelles.
Peut être que tu devrai faire un constructeur de copie également.


 
Je pense que tu dis des conneries :), Si je delete les anciennes données alors je supprimerait les données du triangle initiale a priori.
 
Mais le constructeur par copie c'est pas bete,  il est utilisé par le c++ automatiquement par endroit ?
 
Mon probleme est que j'ai dans mon code un endroit ou je fait un obj.get() qui renvoie une copie d'un triangle (pas une reference donc). Valgrind me dit a la fin de mon code que lrosque je détruit mon triangle initiale j'essaye de détruire une zone mémoire deja détruite au moment ou je fait mon obj.get() (le résultat est utilisé directement donc il est directement détruit).
 
 
 
 
edit --------
Il me fallait bien un constructeur par copie également, merci  :D


Message édité par ffomnislash le 08-05-2008 à 08:56:25
n°1729828
Joel F
Real men use unique_ptr
Posté le 08-05-2008 à 09:04:36  profilanswer
 

std::vector<Edge> quoi , pas Edge* :o

n°1729830
ffomnislas​h
Posté le 08-05-2008 à 09:14:42  profilanswer
 

Joel F a écrit :

std::vector<Edge> quoi , pas Edge* :o


 
d'apres le compilateur ca ne résout pas mon probleme que Edge n'est pas completement défini :o (type incomplet)


Message édité par ffomnislash le 08-05-2008 à 09:16:26
n°1729856
Joel F
Real men use unique_ptr
Posté le 08-05-2008 à 10:52:05  profilanswer
 

alors ça, c'ets ta faute :o pas celle de std:: :o

n°1729866
jesus_chri​st
votre nouveau dieu
Posté le 08-05-2008 à 11:21:44  profilanswer
 

on peut se contenter d'une forward declaration pour un T*, pas pour un vector<T>, ni même pour un T[] d'ailleurs.

n°1729869
Joel F
Real men use unique_ptr
Posté le 08-05-2008 à 11:27:24  profilanswer
 

bah la je vois en quoi Edge a besoin d'etre forward-declaré

n°1729871
jesus_chri​st
votre nouveau dieu
Posté le 08-05-2008 à 11:30:51  profilanswer
 

merde j'avais lu de travers, j'ai cru que c'était suite à l'utilisation de std::vector qu'il avait besoin de la full-declaration.
 
là clairement il manque un #include "Edge.h"

n°1729947
ffomnislas​h
Posté le 08-05-2008 à 15:11:20  profilanswer
 

J'ai bien plus de classe que ca dans mon projet, et il y a bien un probleme de boucle dans les déclaration, A->B->C->D->A, c'est pourquoi j'utilise un pointeur afin d'éviter ce pb.

mood
Publicité
Posté le 08-05-2008 à 15:11:20  profilanswer
 

n°1729957
Joel F
Real men use unique_ptr
Posté le 08-05-2008 à 15:51:44  profilanswer
 

std::vector<Edge*> :o


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

  [c++] operateur affectation

 

Sujets relatifs
[Trouve] Formule auto : affectation valeur cellule en "dur"Problème d'affectation (lib - vc2005)
[Résolu ]Opérateur de comparaison en pythonsurcharge de l'opérateur [][]
[C++] Surchage de l'opérateur [][C++] Problème avec l'opérateur %
[Mysql] opérateur 'ou'surcharge operateur <
Probleme de surcharge d'opérateur et de fonction amiesopérateur d'affectation
Plus de sujets relatifs à : [c++] operateur affectation


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)