Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/03/2007, à 00: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, à 01:17

jobherzt

Re : [C++]Utilisation de constructeur et destructeur

les erreurs que tu obtiens sont pourtant explicites ! smile 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 smile

Dernière modification par jobherzt (Le 02/03/2007, à 01:18)

Hors ligne

#3 Le 02/03/2007, à 01: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, à 01:21)

Hors ligne

#4 Le 02/03/2007, à 01: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, à 01: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, à 02:19

Stephanie

Re : [C++]Utilisation de constructeur et destructeur

best_friend_fr a écrit :

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, à 08: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, à 10: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, à 10: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, à 10: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, à 13: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 04/03/2007, à 00: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