OVH Cloud OVH Cloud

constructeur de copie

2 réponses
Avatar
MarcVDB
Salut à tous,
Je sèche actuellement sur la conception et l'utilisation d'un constructeur
de copie utilisé pour la conception d'une classe de tables. Cette table est
constituée de noeuds contenant trois champs : le premier contient une clef
de type "caractère", le deuxième un pointeur vers un entier, et le troisième
un pointeur vers le noeud suivant.

//**************************************************************************
**//
// -------------------------- STRUCTURE DES
NOEUDS -------------------------- //
//**************************************************************************
**//

struct NoeudTable
{
char cle;
int *ptr;
NoeudTable *svt;
NoeudTable(char c, int *p, NoeudTable *s = NULL) : cle(c), ptr(p), svt(s) {}
};

//**************************************************************************
**//
// ---------------------------- CLASSE DES
TABLES --------------------------- //
//**************************************************************************
**//

class Table
{
public :
Table();
Table(const Table &table);
~Table();
void add(char cle, int valeur);
void remove(char cle);
int *search(char cle);
private :
NoeudTable *lst;
bool test(NoeudTable *&prec, char cle);
};



#include <iostream.h>
#include <fstream.h>
#include "pmm.h"

//**************************************************************************
**//
// ------------------ CONSTRUCTEUR DE LA CLASSE DES
TABLES ------------------ //
//**************************************************************************
**//

Table::Table()
{
lst = new NoeudTable(0, 0);
}

//**************************************************************************
**//
// ------------- CONSTRUCTEUR DE COPIE DE LA CLASSE DES
TABLES -------------- //
//**************************************************************************
**//

Table::Table(const Table &table)
{
NoeudTable *cour = lst = new NoeudTable(0, 0);
for (NoeudTable *courT = table.lst->svt ; courT != NULL; courT =
courT->svt )
{
int *ptr2;
ptr2=new int;
*ptr2=*(courT->ptr);
cour = cour->svt = new NoeudTable(courT->cle, ptr2);
}
}

//**************************************************************************
**//
// ----------------- FONCTION DE SUPPRESSION NOEUD A
NOEUD ------------------ //
//**************************************************************************
**//

void delete1st(NoeudTable *&l)
{
NoeudTable *tmp = l;
l = l->svt;
delete tmp->ptr;
delete tmp;
}

//**************************************************************************
**//
// ------------------ DESTRUCTEUR DE LA CLASSE DES
TABLES ------------------- //
//**************************************************************************
**//

Table::~Table()
{
while (lst!=NULL)
delete1st(lst);
}


Quand on fait passer par les fonctions du programme une table par valeur,
cela plante!
Le constructeur de copie est + que probablement en cause!
Pouvez-vous m'aider?
Grand merci d'avance!
Marc VDB

2 réponses

Avatar
Franck Branjonneau
"MarcVDB" écrivait:

Je sèche actuellement sur la conception et l'utilisation d'un constructeur
de copie utilisé pour la conception d'une classe de tables. Cette table est
constituée de noeuds contenant trois champs : le premier contient une clef
de type "caractère", le deuxième un pointeur vers un entier, et le troisième
un pointeur vers le noeud suivant.


[...]

Quand on fait passer par les fonctions du programme une table par valeur,
cela plante!


Mais encore ?

Le constructeur de copie est + que probablement en cause!


A moins que ce soit autre chose...

Pouvez-vous m'aider?


Essaie de mieux cerner ton problème. En l'état actuel je peux faire
une copie d'une Table vide.
--
Franck Branjonneau

Avatar
Twxs
MarcVDB wrote:
Salut à tous,
Je sèche actuellement sur la conception et l'utilisation d'un constructeur
de copie utilisé pour la conception d'une classe de tables. Cette table est
constituée de noeuds contenant trois champs : le premier contient une clef
de type "caractère", le deuxième un pointeur vers un entier, et le troisième
un pointeur vers le noeud suivant.



Quand on fait passer par les fonctions du programme une table par valeur,
cela plante!
Le constructeur de copie est + que probablement en cause!
Pouvez-vous m'aider?
Grand merci d'avance!
Marc VDB




qd on passe par valeur, le constructeur de copie est bien appelé, mais
egalement le destructeur. je n'ai pas regardé en detail, mais avec ce
genre de structure (de type liste chainee si j'ai bien suivi) faut etre
tres prudent, le constructeur de copie doit recopier tout les attributs
de la classe en "tant qu'objet" et non pointeur. Sinon, a coup sur le
destructeur qui lui est souvent recursif detruit le contenu des objets.

exemple :

struct List{
List * suivant;
List(const List &l){
suivant = l.suivant;
}
~List(){
delete l;
}
};

un truc du style fait planter l'appli qd tu passes une liste par valeur
List *suivant = new List();
{
List l;
l.suivant = suivant;
{
List l_copy(l); // on copie l
}// le destructeur est appele sur l_copy
//et detruit donc l_copy.suivant

//ici un appel de methode sur l.suivant plante car l.suivant
// est delete
}
// ici le destructeur de l est appele et
// tente de deleter l.suivant qui est deja detruit
// ca plante


voila, j'espere ne as avoir répondu a coté de la plaque ;-)

Twxs