[c++] operateur affectation

operateur affectation [c++] - C++ - Programmation

Marsh Posté le 07-05-2008 à 23:01:52    

: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.

Reply

Marsh Posté le 07-05-2008 à 23:01:52   

Reply

Marsh Posté le 07-05-2008 à 23:26:19    

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.

Reply

Marsh Posté le 08-05-2008 à 08:47:44    

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
Reply

Marsh Posté le 08-05-2008 à 09:04:36    

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

Reply

Marsh Posté le 08-05-2008 à 09:14:42    

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
Reply

Marsh Posté le 08-05-2008 à 10:52:05    

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

Reply

Marsh Posté le 08-05-2008 à 11:21:44    

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

Reply

Marsh Posté le 08-05-2008 à 11:27:24    

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

Reply

Marsh Posté le 08-05-2008 à 11:30:51    

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"

Reply

Marsh Posté le 08-05-2008 à 15:11:20    

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.

Reply

Marsh Posté le 08-05-2008 à 15:11:20   

Reply

Marsh Posté le 08-05-2008 à 15:51:44    

std::vector<Edge*> :o

Reply

Sujets relatifs:

Leave a Replay

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