[C++] Destruction non voulue

Destruction non voulue [C++] - C++ - Programmation

Marsh Posté le 01-04-2004 à 15:05:57    

salut, je me mets au C++ et la, je suis confronté à un probleme avec les destructeurs.
cette fonction :

Code :
  1. //Fonction de concaténation avec String
  2. String String::plus(const String & s)
  3. {
  4. char temp[N];
  5. strncpy(temp,chaine,N);  //temp=chaine
  6. strcat(temp,s.chaine); //Concaténation dont le résultat
  7.                        //est déposé dans temp.
  8. String z(temp);
  9. return z;//ici je retourne z mais le destructeur le détruit
  10. }


 
pourquoi z est détruit et le retour foire ??
la fonction fonctionne parfaitement si on ne code pas les destructeurs.
merci de votre aide
++

Reply

Marsh Posté le 01-04-2004 à 15:05:57   

Reply

Marsh Posté le 01-04-2004 à 15:08:28    

j'ai peur.
fais voir ton constructeur (const char *) et ton destructeur ?
(roh pis meme, c'est cradeux ton truc)

Reply

Marsh Posté le 01-04-2004 à 15:11:09    

chrisbk a écrit :

j'ai peur.
fais voir ton constructeur (const char *) et ton destructeur ?
(roh pis meme, c'est cradeux ton truc)
 


 
Alors, le constructeur :

Code :
  1. String::String(const char *s)
  2. {
  3. chaine=new char[N];
  4. if(strlen(s)>N)
  5.  cout<<"Chaine trop longue !\a"<<endl;
  6. strncpy(chaine,s,N);
  7. }


 
Le destructeur :

Code :
  1. String::~String()
  2. {
  3. delete [] chaine;
  4. cout<<"Destruction d'une String"<<endl;
  5. }

Reply

Marsh Posté le 01-04-2004 à 15:13:24    

mais c'est quoi ce N stupide ? tu veux pas le virer ?
T'as fait un constructeur de recopie ? (String::String(const String & ))

Reply

Marsh Posté le 01-04-2004 à 15:17:48    

chrisbk a écrit :

mais c'est quoi ce N stupide ? tu veux pas le virer ?
T'as fait un constructeur de recopie ? (String::String(const String & ))


 
oauis, ya un constructeur par recopie
pour le N, on peut le jareter oui, je pense pas que ca soit la cause du probleme

Code :
  1. String::String(const String & a)
  2. {
  3. chaine=new char[N];
  4. strncpy(chaine,a.chaine,N);
  5. cout<<"Creation d'une String"<<endl;
  6. }

Reply

Marsh Posté le 01-04-2004 à 15:19:03    

c'est normal que Z soit detruit, vu que c'est un objet local. Cela dit il y aura creation d'un nouvel objet par le truchement de ton constructeur de recopie.
 
t'entends quoi par retour qui foire ?

Reply

Marsh Posté le 01-04-2004 à 15:22:41    

en voilà une implémentation de string qui est un anti-modèle [:dawa]

Reply

Marsh Posté le 01-04-2004 à 15:25:38    

chrisbk a écrit :

c'est normal que Z soit detruit, vu que c'est un objet local. Cela dit il y aura creation d'un nouvel objet par le truchement de ton constructeur de recopie.
 
t'entends quoi par retour qui foire ?


 
en fait, le probleme, c'est que je n'utilisais pas le constructeur par recopie...
je faisais ca :
 

Code :
  1. String s1("azerty" ),s2('q'),s3;
  2. s3=s1.plus(s2);


 
je pense qu'en faisant  

Code :
  1. s3(s1.plus(s2))


ca devrait fonctionner...
 
c'est vraiment mon tout premier code en C++ donc fo etre indulgent..
 
j'ai deja peur d'une future intervention de Taz (koike je c pas si il intervient aussi en C++ :??: )

Reply

Marsh Posté le 01-04-2004 à 15:26:11    

Taz a écrit :

en voilà une implémentation de string qui est un anti-modèle [:dawa]


 
lol, kes ke je disais !!
 
tu peux m'expliquer ce que tu veux dire par la stp et quelle aurait été une solution plus correcte ?

Reply

Marsh Posté le 01-04-2004 à 15:29:31    

1) pas de gestion d'erreur (magique ton constructeur d'ailleurs)
2) chaine à taille fixe ...
3) tu traines les boulets de c-string à savoir l'\0 final
4) t'as pas de surcharge d'opérateur
5) etc
 
je sais que c'est à but didactique, mais bien faire ça c'est déjà très compliqué, ça demande de la réflexion

Reply

Marsh Posté le 01-04-2004 à 15:29:31   

Reply

Marsh Posté le 01-04-2004 à 15:35:49    

Taz a écrit :

1) pas de gestion d'erreur (magique ton constructeur d'ailleurs)
2) chaine à taille fixe ...
3) tu traines les boulets de c-string à savoir l'\0 final
4) t'as pas de surcharge d'opérateur
5) etc
 
je sais que c'est à but didactique, mais bien faire ça c'est déjà très compliqué, ça demande de la réflexion


 
je vais essayer d'ameliorer tout ca.
je decouvre la POO et le C++, ya vraiment beaucoup de fonctionnalités...
c'est mon premier TP ca en fait et je suis allé un peu plus loin puisque l'enoncé ne demandait que une allocation statique.
mais comme je compte coder mes prochians projets en C++, j'essaie d'acquerir de bon automatismes des le debut


Message édité par captainneuneu le 01-04-2004 à 15:36:00
Reply

Marsh Posté le 01-04-2004 à 15:37:39    

ben là c'est bof ...
 
si tu commencais par faire une pauvre classe qui contient juste
 
int *p = new int;
 
et qui gère ça à peu près correctement, ça serait déjà énorme

Reply

Marsh Posté le 01-04-2004 à 15:42:06    

Taz a écrit :

ben là c'est bof ...
 
si tu commencais par faire une pauvre classe qui contient juste
 
int *p = new int;
 
et qui gère ça à peu près correctement, ça serait déjà énorme


 
mon projet en cours c du cryptage RSA
je comptait créer une classe qui gere les nombres infinis, mais je pense que ca sera trop galere vu mon niveau..
je pense deja faire une classe complete et bien propre pour gerer des __int64
 
mais si t'as des suggestions..

Reply

Marsh Posté le 01-04-2004 à 15:42:38    

ou alors, je code le projet en C, mais je veux vraiment me mettre a la POO

Reply

Marsh Posté le 01-04-2004 à 15:45:20    

vois le désastre ... je te propose de faire le petit exercice que je t'ai dit, juste pour te tester

Reply

Sujets relatifs:

Leave a Replay

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