Heritage

Le
Axel
Bonjour
j ai un probleme "simple" que je n arrive pas a resoudre
j ai une classe Animal , avec une fonction virtuelle afficher() , 2
classes Chien et chat heritant de Animal.
J ai une classe Humain qui a comme attribut un tableau d' Animal
et j aimerais faire kkchose du genre :
Humain un_humain;

un_humain.ajouter_animal(Animal a)

qui ajouterai cet animal a dans le tableau, mais je ne sais pas trop
comment m y prendre, j aimerais eviter de devoir "reconstruite" un
animal (surtout qu il faudrait deviner quel animal est ce). Peut etre
avec les références, mais je n arrive pas à saisir précisément comment
faire.

SI quelqu un peut m aider..
Merci d avance.
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Twxs
Le #714847
Axel wrote:
Bonjour
salut

j ai un probleme "simple" que je n arrive pas a resoudre
j ai une classe Animal , avec une fonction virtuelle afficher() , 2
classes Chien et chat heritant de Animal.
J ai une classe Humain qui a comme attribut un tableau d' Animal
et j aimerais faire kkchose du genre :
Humain un_humain;
...
un_humain.ajouter_animal(Animal a)

qui ajouterai cet animal a dans le tableau, mais je ne sais pas trop
comment m y prendre, j aimerais eviter de devoir "reconstruite" un
animal (surtout qu il faudrait deviner quel animal est ce). Peut etre
avec les références, mais je n arrive pas à saisir précisément comment
faire.



il me semble que je ne me trompe pas en disant que les methode
virtuelles ne fonctionne que sur les pointeurs (j'espere ne pas dire de
betise sous peine de me faire lincher ;-) )

donc moi je ferais un truc du style :
class Humain{
vector<Animal*> animaux;
public:
void ajouter_animal(Animal *a){
animaux.push_back(a);
}
void affiche(void){
for (size_t i = 0; i < animaux.size; ++i)
animaux[i]->afficher();
}

};

Chien chien;
Chat chat;
Humain humain;
humain.ajouter_animal(&chien);
humain.ajouter_animal(&chat);
humain.affiche();

voila ca devrait le faire, comme c'est des pointeur, il n'y a pas de
recopie d'objets.


Twxs

Matthieu Moy
Le #714846
Twxs
il me semble que je ne me trompe pas en disant que les methode
virtuelles ne fonctionne que sur les pointeurs (j'espere ne pas dire
de betise sous peine de me faire lincher ;-) )


Non non :-)

Tant que tu n'utilises pas de pointeur, le type statique est forcément
le même que le type dynamique (en fait, tant qu'il n'y a pas de
pointeur, il faut connaitre la taille de l'objet pour pouvoir le
stoquer, donc, il faut connaitre son type dynamique -- ou alors, il
faudrait accepter d'avoir un language parfaitement inefficace). Donc,
la notion de fonction virtuelle n'aurait pas vraiment de sens ...

--
Matthieu

Axel
Le #714648
voila ca devrait le faire, comme c'est des pointeur, il n'y a pas de
recopie d'objets.


Twxs


Mais ces objets sont crées dans des fonctions , une fois l objet ajouté,
et une fois sorti de la fonction, l objet n est plus dans le tableau non ?

Franck Branjonneau
Le #714647
Twxs
il me semble que je ne me trompe pas en disant que les methode
virtuelles ne fonctionne que sur les pointeurs (j'espere ne pas dire
de betise sous peine de me faire lincher ;-) )


Prépare la corde ;-) Il y a aussi liaison dynamique avec les références.
--
Franck Branjonneau
Franck Branjonneau
Le #714646
Axel
voila ca devrait le faire, comme c'est des pointeur, il n'y a pas de
recopie d'objets.


Mais ces objets sont crées dans des fonctions , une fois l objet
ajouté, et une fois sorti de la fonction, l objet n est plus dans le
tableau non ?


Il n'y a jamais été. Seule une indirection vers cet objet -- son
adresse -- a été stockée. Et, en effet, une fois sorti de la fonction
l'objet est détruit et l'adresse stockée n'a plus de sens.

Pour résoudre le problème il faut maîtriser la durée de vie de
l'objet. Une solution usuelle utilise new/delete.
--
Franck Branjonneau

Axel
Le #714645
On Sat, 03 Apr 2004 13:41:22 +0200, Franck Branjonneau wrote:

Il n'y a jamais été. Seule une indirection vers cet objet -- son
adresse -- a été stockée. Et, en effet, une fois sorti de la fonction
l'objet est détruit et l'adresse stockée n'a plus de sens.

Pour résoudre le problème il faut maîtriser la durée de vie de
l'objet. Une solution usuelle utilise new/delete.



Donc, avec un tableau de pointeurs d'objet, en allouant a ces pointeurs
une zone memoire, et en y "copiant" l objet c est mieux. Mais comment
"recopier" l objet ? redefinir l operateur [] ? Constructeur par recopie ?

Quelle est la meilleure solution ?

Merci d avance.
Axel

Twxs
Le #714644
Franck Branjonneau wrote:

Twxs

il me semble que je ne me trompe pas en disant que les methode
virtuelles ne fonctionne que sur les pointeurs (j'espere ne pas dire
de betise sous peine de me faire lincher ;-) )



Prépare la corde ;-) Il y a aussi liaison dynamique avec les références.


la corde est autour de mon cou ;-)
en effet ca fonctionne et je suis sur le cul. enfin la chose qui me
rassure c'est que ca ne fonctionne pas si la classe de base est pure
virtuel.

Twxs


Twxs
Le #714643
Axel wrote:



Donc, avec un tableau de pointeurs d'objet, en allouant a ces pointeurs
une zone memoire, et en y "copiant" l objet c est mieux. Mais comment
"recopier" l objet ? redefinir l operateur [] ? Constructeur par recopie ?

Quelle est la meilleure solution ?



tu n'as pas a recopier l'objet (con contenu), mais juste a stocker
l'adresse de l'objet.

donc si les objets son créé dans une methode utiliser des new

Homme tintin;

void add_chien(){
Chien *chien = new Chien("milou");
tintin.ajouter_animal(chien);
}

le delete du chien sera fait par exemple dans le destructeur de Homme

virtual ~Homme(){
for (int i = 0; i < animaux.size(); ++i)
delete animaux[i];
}

voila

Axel
Le #714642
On Sat, 03 Apr 2004 14:35:37 +0200, Twxs wrote:

tu n'as pas a recopier l'objet (con contenu), mais juste a stocker
l'adresse de l'objet.

donc si les objets son créé dans une methode utiliser des new

Homme tintin;

void add_chien(){
Chien *chien = new Chien("milou");
tintin.ajouter_animal(chien);
}

le delete du chien sera fait par exemple dans le destructeur de Homme

virtual ~Homme(){
for (int i = 0; i < animaux.size(); ++i)
delete animaux[i];
}

voila



En effet, et en passant l'adresse du "conteneur" (tintin dans ton exemple),
tintin->ajouter() me donne enfin ce que je voulais.
En tout cas merci bcp pour vos réponses.

Axel

Franck Branjonneau
Le #714438
Axel
On Sat, 03 Apr 2004 13:41:22 +0200, Franck Branjonneau wrote:

Il n'y a jamais été. Seule une indirection vers cet objet -- son
adresse -- a été stockée. Et, en effet, une fois sorti de la fonction
l'objet est détruit et l'adresse stockée n'a plus de sens.

Pour résoudre le problème il faut maîtriser la durée de vie de
l'objet. Une solution usuelle utilise new/delete.



Donc, avec un tableau de pointeurs d'objet, en allouant a ces pointeurs
une zone memoire, et en y "copiant" l objet c est mieux. Mais comment
"recopier" l objet ? redefinir l operateur [] ? Constructeur par recopie ?


On n'alloue pas une zone mémoire à un pointeur ; on alloue une zone
mémoire et on mémorise l'adresse de cette zone avec un pointeur.

La sémantique du new que tu connais est allocation de mémoire et
construction de l'objet dans cette zone ; il n'y a pas de copie.

Quelle est la meilleure solution ?


La meileure solution est la tienne ;-).
--
Franck Branjonneau

Publicité
Poster une réponse
Anonyme