#1 Le 09/10/2008, à 08:29
- Kranagard
[resolu][c++]Probleme de constructeur/destructeur
voila, j'ai une classe Client qui dérive d'une classe Personne (logique jusque la) mais lors de son instanciation, tout va bien jusqu'a la fin puis... je ne sais pas pourquoi il passe dans le destructeur et me detruit tout l'objet
comme le montre gdb (j'vous dis pas le temp que j'ai passé a verifier toutes mes methodes avant de voir que ct ça:( )
52 CLIENT client(_nom,_prenom,_lieuNaissance,_dateNaissance,_adresse,_numClient);
(gdb)
CLIENT (this=0xbfcaedb0, _nom=@0x804eaf6, _prenom=@0x804eaef,
_lieuNaissance=@0x804eae3, _dateNaissance=@0x804ead8, _adresse=@0x804eac7,
_numClient=@0x804eafc) at Client.cpp:14
14 CLIENT::CLIENT(char& _nom,char& _prenom,char& _lieuNaissance,char& _dateNaissance,char& _adresse,char& _numClient):PERSONNE(_nom,_prenom,_lieuNaissance,_dateNaissance,_adresse)
(gdb)
PERSONNE (this=0xbfcaedb0, _nom=@0x804eaf6, _prenom=@0x804eaef,
_lieuNaissance=@0x804eae3, _dateNaissance=@0x804ead8, _adresse=@0x804eac7)
at Personne.cpp:20
20 PERSONNE::PERSONNE(char& _nom,char& _prenom,char& _lieuNaissance,char& _dateNaissance,char& _adresse)
(gdb)
22 nom = new char[strlen(&_nom)+1];
(gdb)
23 strcpy(nom,&_nom);
(gdb)
24 prenom = new char[strlen(&_prenom)+1];
(gdb)
25 strcpy(prenom,&_prenom);
(gdb)
26 lieuNaissance = new char[strlen(&_lieuNaissance)+1];
(gdb)
27 strcpy(lieuNaissance,&_lieuNaissance);
(gdb)
28 if(strlen(&_dateNaissance)==10)
(gdb)
30 dateNaissance = new char[12];
(gdb)
31 strcpy(dateNaissance,&_dateNaissance);
(gdb)
38 adresse = new char[strlen(&_adresse)+1];
(gdb)
39 strcpy(adresse,&_adresse);
(gdb)
40 }
(gdb)
Vector (this=0xbfcaedcc) at Vector.h:100
100 data = NULL;
(gdb)
101 nbrElem = 0;
(gdb)
CLIENT (this=0xbfcaedb0, _nom=@0x804eaf6, _prenom=@0x804eaef,
_lieuNaissance=@0x804eae3, _dateNaissance=@0x804ead8, _adresse=@0x804eac7,
_numClient=@0x804eafc) at Client.cpp:16
16 numClient = new char[strlen(&_numClient)+1];
(gdb)
17 strcpy(numClient,&_numClient);
(gdb)
18 }
(gdb)
~CLIENT (this=0xbfcaedb0) at Client.cpp:20
20 CLIENT::~CLIENT()
(gdb)
22 delete [] numClient;
(gdb)
23 }
(gdb)
~Vector (this=0xbfcaedcc) at Vector.h:107
107 for(int i=nbrElem; i>=0; i--)
(gdb)
109 if(nodeAt(i)!=NULL)
(gdb)
Vector<CONTRATASSURANCE>::nodeAt (this=0xbfcaedcc, i=0) at Vector.h:133
133 Noeud <T> *temp = data;
(gdb)
134 if(i<nbrElem)
(gdb)
142 return NULL;
(gdb)
~Vector (this=0xbfcaedcc) at Vector.h:107
107 for(int i=nbrElem; i>=0; i--)
(gdb)
112 delete data;
(gdb)
~PERSONNE (this=0xbfcaedb0) at Personne.cpp:41
41 PERSONNE::~PERSONNE()
(gdb)
43 delete [] nom;
(gdb)
44 delete [] prenom;
(gdb)
45 delete [] lieuNaissance;
(gdb)
46 delete [] dateNaissance;
(gdb)
47 delete [] adresse;
(gdb)
48 }
et voila le code:
client.h
#ifndef _CLIENT_H
#define _CLIENT_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "Personne.h"
#include "Vector.h"
#include "ContratAssurance.h"
using namespace std;
class CONTRATASSURANCE;
class CLIENT:public PERSONNE{
private:
char *numClient;
Vector<CONTRATASSURANCE> contrats;
public:
CLIENT();
CLIENT(char& _nom,char& _prenom,char& _lieuNaissance,char& _dateNaissance,char& _adresse,char& _numClient);
~CLIENT();
};
#endif
personne.h
#ifndef _PERSONNE_H
#define _PERSONNE_H
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
class PERSONNE{
private:
char *nom, *prenom, *lieuNaissance, *dateNaissance, *adresse;
public:
PERSONNE();
PERSONNE(char& _nom,char& _prenom,char& _lieuNaissance,char& _dateNaissance,char& _adresse);
~PERSONNE();
};
#endif
client.cpp
#include "Client.h"
using namespace std;
class CLIENT;
CLIENT::CLIENT():PERSONNE()
{
numClient = new char[2];
strcpy(numClient,"");
//les char* seront dynamiquement allouée
}
CLIENT::CLIENT(char& _nom,char& _prenom,char& _lieuNaissance,char& _dateNaissance,char& _adresse,char& _numClient):PERSONNE(_nom,_prenom,_lieuNaissance,_dateNaissance,_adresse)
{
numClient = new char[strlen(&_numClient)+1];
strcpy(numClient,&_numClient);
}
CLIENT::~CLIENT()
{
delete [] numClient;
}
personne.cpp
#include "Personne.h"
using namespace std;
class PERSONNE;
PERSONNE::PERSONNE()
{
nom = new char[2];
strcpy(nom,"");
prenom = new char[2];
strcpy(prenom,"");
dateNaissance = new char[12];
strcpy(dateNaissance,"");
lieuNaissance = new char[2];
strcpy(lieuNaissance,"");
adresse = new char[2];
strcpy(adresse,"");
}
PERSONNE::PERSONNE(char& _nom,char& _prenom,char& _lieuNaissance,char& _dateNaissance,char& _adresse)
{
nom = new char[strlen(&_nom)+1];
strcpy(nom,&_nom);
prenom = new char[strlen(&_prenom)+1];
strcpy(prenom,&_prenom);
lieuNaissance = new char[strlen(&_lieuNaissance)+1];
strcpy(lieuNaissance,&_lieuNaissance);
if(strlen(&_dateNaissance)==10)
{
dateNaissance = new char[12];
strcpy(dateNaissance,&_dateNaissance);
}
else
{
dateNaissance = new char[12];
strcpy(dateNaissance,"");
}
adresse = new char[strlen(&_adresse)+1];
strcpy(adresse,&_adresse);
}
PERSONNE::~PERSONNE()
{
delete [] nom;
delete [] prenom;
delete [] lieuNaissance;
delete [] dateNaissance;
delete [] adresse;
}
evidement je n'ai mis ici que les constructeurs/destructeur sinon j'aurai fait un post geant.
on peut aussi remarquer sous gdb que mon destructeur fonctionne correctement, c'es un bon point pour la suite
voila, merci a vous
Dernière modification par Kranagard (Le 09/10/2008, à 11:27)
Hors ligne
#2 Le 09/10/2008, à 09:08
- rniamo
Re : [resolu][c++]Probleme de constructeur/destructeur
essaye avec des char* au lieu de char&, ou des std::string.
Sinon initialise à NULL tes pointeurs et vérifie qu'il sont bien alloués.
< Quelques un des mes programmes | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
\ ^__^
\ (o o)\_______
(___)\ )\
Hors ligne
#3 Le 09/10/2008, à 11:21
- Kranagard
Re : [resolu][c++]Probleme de constructeur/destructeur
public:
CLIENT();
CLIENT(char* _nom,char* _prenom,char* _lieuNaissance,char* _dateNaissance,char* _adresse,char* _numClient);
~CLIENT();
public:
PERSONNE();
PERSONNE(char* _nom,char* _prenom,char* _lieuNaissance,char* _dateNaissance,char* _adresse);
~PERSONNE();
c'est ce que j'avais a la base, mais le probleme reste le même. après construction d'un client, une fois que tout est alloué et set il passe dans le destructeur, retourne sur le main qui lui rale parce que du coup client est null...
Hors ligne
#4 Le 09/10/2008, à 11:28
- Kranagard
Re : [resolu][c++]Probleme de constructeur/destructeur
je l'instanciais dans un methode et comme un boolz j'ai oublié * pour dire que je voulais un nouvel objet et non pas un objet locale a la methode...
Hors ligne
#5 Le 09/10/2008, à 13:45
- nicolas66
Re : [resolu][c++]Probleme de constructeur/destructeur
Oublie pas de déclarer les destructeurs comme virtuels.
"The computer was born to solve problems that did not exist before." (B. Gates)
Hors ligne