Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Heritage

21 réponses
Avatar
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.

10 réponses

1 2 3
Avatar
Twxs
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

Avatar
Matthieu Moy
Twxs writes:

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

Avatar
Axel
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 ?

Avatar
Franck Branjonneau
Twxs écrivait:

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

Avatar
Franck Branjonneau
Axel écrivait:

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


Avatar
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 ?

Quelle est la meilleure solution ?

Merci d avance.
Axel

Avatar
Twxs
Franck Branjonneau wrote:

Twxs écrivait:


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


Avatar
Twxs
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

Avatar
Axel
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

Avatar
Franck Branjonneau
Axel écrivait:

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


1 2 3