Exercice sur Pointeurs, classes, héritage...

snoozriton
Messages postés
12
Date d'inscription
jeudi 22 décembre 2011
Statut
Membre
Dernière intervention
12 novembre 2010
- 5 janv. 2010 à 20:56
snoozriton
Messages postés
12
Date d'inscription
jeudi 22 décembre 2011
Statut
Membre
Dernière intervention
12 novembre 2010
- 6 janv. 2010 à 13:19
Bonjour à tous,

étant en train d'étudier le C++, j'ai quelques soucis avec un exercice.
C'est un classique dont je vous donne l'énoncé :
[b]1. Définissez la classe Animal qui sera muni des champs age, sexe et nom.
2. Définissez les classe Chien, Chat et Lapin qui héritent de Animal ainsi
que des constructeurs pour chacune de ces classes.
3. On consid`ere un tableaux de cinq pointeurs sur la classe Animal. Faites les modifications n ́ecessaires pour proposer une fonction remplissant ce tableau `a l’aide d’informations entrées au clavier, sachant que l’utilisateur précisera si l’animal considéré est un chien, un chat ou un lapin.
4. Faites les modifications nécessaires pour proposer une fonction qui retourne l’age moyen des animaux du tableau.
5. Faites les modifications nécessaires pour proposer une fonction qui indique le nombre de chiens, de chats et de lapins présents dans le tableau.
6. Faites les modifications n ́ecessaires pour proposer une fonction qui affiche à l'écran toutes les caractéristiques des animaux contenus dans le tableau.
7. Faites les modifications nécessaires pour proposer une fonction qui supprime du tableau tous les chats et chiens mâles.
Lorsque l’utilisateur lance le programme, il doit se trouver face au menu suivant :
• pour remplir le tableau d’animaux, tapez 1.
• pour afficher à l'écran toutes les caract ́eristiques des animaux contenus
dans le tableau, tapez 2.
• pour connaitre l’age moyen des animaux du tableau, tapez 3.
• pour connaitre le nombre de chiens, de chats et de lapins pr ́esents dans le
tableau, tapez 4.
• Pour supprimer du tableau tous les chats et chiens mâles, tapez 5.
Si l’utilisateur tape 0, il sort du programme, sinon l’utilisateur teste la fonction de la question correspondant au numéro inscrit après tapez et on retourne au menu principal./b

Jusqu'ici, je n'ai jamais eu de problème avec les exercices simples sur les pointeurs ou les classes. Mais là, tout se mélange et je m'y perds quelque peu...

Je vous mets le début de code que j'ai fait. Ca compile mais ça plante lamentablement lorsque après la saisie d'un 2eme animal.

[b]#include
#include <string>
#include <stdlib.h>

using namespace std;

class Animal{
protected:
int age;
char sexe;
string nom;
public:
Animal(int a=0, char s=NULL, string n=""){
age=a;
sexe=s;
nom=n;
}
void affiche(){
cout << age << " " << sexe << " " << nom << " ";
}
~Animal(){}
};

class Chien : public Animal {
private:
string race;
public:
Chien(int a=0, char s=NULL, string n="", string r="Chien"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
//~Chien(){}
};

class Lapin : public Animal {
private:
string race;
public:
Lapin(int a=0, char s=NULL, string n="", string r="Lapin"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}

};

class Chat: public Animal {
private:
string race;
public:
Chat(int a=0, char s=NULL, string n="", string r="Chat"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
};

int menu () {
int choix;
cout << " 1 - Pour saisir un chat" <<endl;
cout << " 2 - Pour saisir un chien" <<endl;
cout << " 3 - Pour saisir un lapin" <<endl;
cout << endl << "Choix : ";
cin >> choix;
return choix;

}



void remplissage_tab(Animal *tab, int i){
int choix;
string n;
char s;
int a;
choix=menu();
cout << "Saisissez son nom : ";
cin >> n;
cout << "Saisissez son age : ";
cin >> a;
cout << "Saisissez son sexe M ou F : ";
cin >> s;
switch(choix){ case 1 : tab[i] = Chat(a,s,n);
break;
case 2 : tab[i] = Chien(a,s,n);
break;
case 3 : tab[i] = Lapin(a,s,n);
break;
}
}

void affichage_tab(Animal *tab, int i){
tab[i].affiche();
}


main(){
Animal * tab = new Animal[5];
int i;
for (i=0; i<5; i++) {
remplissage_tab(&tab[i],i);
}
for (i=0; i<5; i++) {
affichage_tab(&tab[i],i);
}
}
/b

14 réponses

snoozriton
Messages postés
12
Date d'inscription
jeudi 22 décembre 2011
Statut
Membre
Dernière intervention
12 novembre 2010
1
6 janv. 2010 à 11:38
Encore moi ! Voilà donc ce que donne mon code pour le moment.
#include 

#define SIZE 2
using namespace std;

class Animal{
protected:
int age;
char sexe;
string nom;
public:	
Animal(int a=0, char s='F', string n=""){
age=a;
sexe=s;
nom=n;
}
void affiche(){
cout << age << " " << sexe << " " << nom;
}
virtual string type(){
return "Animal";
}
~Animal(){}
};

class Chien : public Animal {
private:
string race;
public:
Chien(int a=0, char s='F', string n="", string r="Chien"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
virtual string type(){
return race;
}
~Chien(){}
};

class Lapin : public Animal {
private:
string race;
public:
Lapin(int a=0, char s='F', string n="", string r="Lapin"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
virtual string type(){
return race;
}

};

class Chat: public Animal {
private:
string race;
public:
Chat(int a=0, char s='F', string n="", string r="Chat"){
age=a;
sexe=s;
nom=n;
race=r;
}
void affiche(){
affiche();
cout << race << endl;
}
virtual string type(){
return race;
}
};

int menu_animal () {
int choix;      
cout << "   1 - Pour saisir un chat" <<endl;
cout << "   2 - Pour saisir un chien" <<endl;
cout << "   3 - Pour saisir un lapin" <<endl; 
cout << endl << "Choix : ";     
cin >> choix;
return choix;   

}



void remplissage_tab(Animal **tab){
int i,a,choix;
string n;
char s;
for (i=0; i<SIZE; i++) {
cout << "Saisie de l'animal num " << i+1 << endl;
choix=menu_animal();
cout << "Saisissez son nom : ";
cin >> n;
cout << "Saisissez son age : ";
cin >> a;
cout << "Saisissez son sexe M ou F : ";
cin >> s;
switch(choix){                        		
case 1 : tab[i] = new Chat(a,s,n);
break; 
case 2 : tab[i] = new Chien(a,s,n); 
break;
case 3 : tab[i] = new Lapin(a,s,n); 
break;
}
}
}

void affichage_tab(Animal **tab){
int i;
cout << "Age " << "Sexe " << "Nom" << " Type" << endl;
for (i=0; i<SIZE; i++) {
tab[i]->affiche(); 
cout << " " <<tab[i]->type() << endl;
}
}

float age_moy(Animal **tab){
int i;
float som;
som=0;
for (i=0; i<SIZE; i++) {
som=som + tab[i]->age; 
}
return som;
}



main(){
Animal * tab[SIZE];
remplissage_tab(tab);
affichage_tab(tab);
system("pause");
}


Mon souci est dans la fonction age_moy
j'ai besoin d'accéder à l'attribut age qui est, à l'heure actuelle, en protected.
Quel est le meilleur moyen pour pouvoir y accéder ?
Je ne dois pas pouvoir tout passer en public j'imagine.
Créer une méthode virtuelle qui me retourne l'age de l'animal ?
1