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.
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(); }
voila ca devrait le faire, comme c'est des pointeur, il n'y a pas de recopie d'objets.
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();
}
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(); }
voila ca devrait le faire, comme c'est des pointeur, il n'y a pas de recopie d'objets.
Twxs
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
Twxs <Twxs@free.fr> 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 ...
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
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 ?
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 ?
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
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
Twxs <Twxs@free.fr> é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 <fasbjx@free.fr>
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
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
Axel <axelATTazerty@netcourrierDOTT.com> é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 <fasbjx@free.fr>
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
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
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 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
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
Franck Branjonneau wrote:
Twxs <Twxs@free.fr> é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.
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
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 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];
}
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
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
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.
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
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
Axel <axelDDOOTTazertyAT@ATnetcourrier.com> é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 <fasbjx@free.fr>
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