#1 Le 01/03/2007, à 23:41
- Stephanie
[C++]Utilisation de constructeur et destructeur
Hello,
Je suis débutante.
j'essaye d'écrire une classe Animal avec son consctructeur et son destructeur.
J'obtiens les erreurs suivantes :
Animal.cc: In destructor ‘Animal::~Animal()’:
Animal.cc:15: erreur: type ‘int’ argument given to ‘delete’, expected pointer
Animal.cc:16: erreur: type ‘int’ argument given to ‘delete’, expected pointer
Animal.cc: In function ‘int main()’:
Animal.cc:30: erreur: conversion from ‘Animal*’ to non-scalar type ‘Animal’ requested
Pouvez-vous m'indiquer ce qu'il faut faire pour corriger cela.
Merci
La classe Animal :
#include <iostream>
class Animal{
private:
int poids;
int age;
public:
Animal(int poids, int age){
this->poids = poids;
this->age = age;
}
~Animal(){
delete poids;
delete age;
}
int getPoids(){
return poids;
}
int getAge(){
return age;
}
};
int main(){
Animal animal = new Animal(50, 7);
printf("Poids = %d\nAge = %d\n", animal.getPoids(), animal.getAge());
return 0;
}
Hors ligne
#2 Le 02/03/2007, à 00:17
- jobherzt
Re : [C++]Utilisation de constructeur et destructeur
les erreurs que tu obtiens sont pourtant explicites ! alors :
tu ne peux "deleter" que des pointeurs, pas des entiers. donc tu n'a a la limite pas besoin de destructeur, mais tu peux simplement le laisser vide.
de meme l'operateur new ne s'utilise que pour un pointeur. donc contentes toi de
Animal animal(50,7);
accessoirment, c'est toujours malin de prevoir aussi un 2e constructeur sans parametre, ca peut eviter des embrouilles.
[edit]
et en C++ on utilise cout, pas printf
Dernière modification par jobherzt (Le 02/03/2007, à 00:18)
Hors ligne
#3 Le 02/03/2007, à 00:21
- Stephanie
Re : [C++]Utilisation de constructeur et destructeur
J'ai besoin d'un constructeur car je vais ensuite créer 2 classes Tigre et Serpent qui hériteront de Animal.
Pour pouvoir faire :
Animal animal = new Tigre();
Je serai obligé de créer un destructeur car j'utiliserai new, n'est-ce pas ?
Si ce n'est pas le cas, comment faire alors ?
Merci
Dernière modification par Stephanie (Le 02/03/2007, à 00:21)
Hors ligne
#4 Le 02/03/2007, à 00:27
- jobherzt
Re : [C++]Utilisation de constructeur et destructeur
non, rien a voir :-) le destructeur sert seulement si ta classe contient des pointeurs !!!
et non, tu n'as pas forcement besoin de new,, meme si c'est vrai que cela apporte une certaine souplesse. mais new ne s'utilse qu'avec un pointeur donc :
Animal * anim=new Tigre();
std::cout << anim->getMachin() << std::endl;
Hors ligne
#5 Le 02/03/2007, à 00:46
- best_friend_fr
Re : [C++]Utilisation de constructeur et destructeur
Pour bien comprendre, il faut que tu regardes ce qui se passe en mémoire.
Imagines que l'objet Tigre prenne 100 octets.
La ligne
Animal *anim;
n'alloue qu'un pointeur, donc 4 octets (en général).
Lorsque tu fais
anim=new Tigre()
tu crée un objet tigre (100 octets), et le new renvoie un pointeur, que tu stockes dans anim.
lorsque tu fais un delete sur un pointeur, tu désalloue la mémoire de l'objet pointé, et non du pointeur.
Il faut bien faire la différence entre l'objet pointé et le pointeur pour éviter les fuites de mémoire.
exemple :
si tu tappes
for (int i=0;i<50;i++)
Animal * anim=new Tigre();
tu te dis que anim est une variable locale, donc qu'elle est détruite à chaqe boucle. Mais l'objet pointé lui, n'est pas détruit. Tu viens de perdre 5000 octets...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#6 Le 02/03/2007, à 01:19
- Stephanie
Re : [C++]Utilisation de constructeur et destructeur
exemple :
si tu tappes
for (int i=0;i<50;i++) Animal * anim=new Tigre();
tu te dis que anim est une variable locale, donc qu'elle est détruite à chaqe boucle. Mais l'objet pointé lui, n'est pas détruit. Tu viens de perdre 5000 octets...
Pour détruire anim, il faudra que je fasse :
delete anim
à la fin du programme, une fois que je n'aurais plus besoin de cet objet ?
J'ai une autre question.
Est-ce qu'il faut "delete" un tableau statique
Admettons que j'ai la classe :
class A{
private:
int tab[10][50];
public:
A(){
for(int i=0; i<10; i++)
for(int j=0; j<50; j++)
tab[i][j] = 1;
}
~A(){
for(int i=0; i<10; i++)
delete tab[i];
delete [] tab;
}
};
Est-ce qu'il faut que je crée un destructeur et est-ce que c'est comme cela qu'on désalloue le tableau.
Merci
Hors ligne
#7 Le 02/03/2007, à 07:19
- jobherzt
Re : [C++]Utilisation de constructeur et destructeur
non, tu n'as pas besoin d'effacer les tableaux, sauf evidemment s'ils contiennent des pointeurs.
Hors ligne
#8 Le 02/03/2007, à 09:13
- best_friend_fr
Re : [C++]Utilisation de constructeur et destructeur
Salut
Une règle simple à retenir, c'est que pour chaque new il doit y avoir un delete, et pour chaque delete un new.
Pour ton tableau, tu n'as pas fait de new, donc pas de delete...
Pour détruire anim, il faudra que je fasse :
delete anim
à la fin du programme, une fois que je n'aurais plus besoin de cet objet ?
En l'occurrence, sur mon exemple, tu ne peux pas le faire à la fin du programme. En effet, comme ton pointeur a pointé successivement sur 50 adresses différentes, tu as perdu l'adresse des 49 premiers.
Il n'y a pas de solutions comme ca. Il faudrait faire un tableau de pointeurs.
Dernière modification par best_friend_fr (Le 02/03/2007, à 09:15)
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#9 Le 03/03/2007, à 09:49
- gene69
Re : [C++]Utilisation de constructeur et destructeur
en effet
for (int i=0;i<50;i++)
Animal * anim=new Tigre();
est equivalent à
for (int i=0;i<50;i++) {
Animal * anim=new Tigre();
}
comme la variable anim est existe dans le bloc il faut libérer les objets sur laquelle elle pointe avant de sortir du bloc.
for (int i=0;i<50;i++) {
Animal * anim=new Tigre();
delete anim;
}
après si tu cherches la petite bête je ne sais pas si le programme se comporte
->comme s'il avait 50 blocs de 1 lignes
->un seul bloc de 50 lignes..
je penche pour la premiers solution. à vérifier.
Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion
Hors ligne
#10 Le 03/03/2007, à 12:18
- best_friend_fr
Re : [C++]Utilisation de constructeur et destructeur
50 blocs de 1 ligne, quasi sur...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#11 Le 03/03/2007, à 23:48
- gene69
Re : [C++]Utilisation de constructeur et destructeur
moi aussi "quasi". d'ou le quasi. mon argument est de dire qu'on ne vas pas constuire une variable déjà construite ... je suis sur qu'une surchage de constructeur/destructeur suffierai à notre expérience.
Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion
Hors ligne