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.
//**************************************************************************
**//
// ------------------ 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 ------------------ //
//**************************************************************************
**//
//**************************************************************************
**//
// ------------------ 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
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
"MarcVDB" <marcvandenbril@tiscali.be> é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 <fasbjx@free.fr>
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
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
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 ;-)
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 ;-)