 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
MarcVDB Guest
|
Posted: Tue Apr 06, 2004 2:36 pm Post subject: constructeur de copie |
|
|
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
|
|
| Back to top |
|
 |
Franck Branjonneau Guest
|
Posted: Tue Apr 06, 2004 3:47 pm Post subject: Re: constructeur de copie |
|
|
"MarcVDB" <marcvandenbril (AT) tiscali (DOT) be> écrivait:
| Quote: | 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.
|
[...]
| Quote: | Quand on fait passer par les fonctions du programme une table par valeur,
cela plante!
|
Mais encore ?
| Quote: | Le constructeur de copie est + que probablement en cause!
|
A moins que ce soit autre chose...
| Quote: | 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 <fasbjx (AT) free (DOT) fr>
|
|
| Back to top |
|
 |
Twxs Guest
|
Posted: Tue Apr 06, 2004 11:05 pm Post subject: Re: constructeur de copie |
|
|
MarcVDB wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|