C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

questions élémentaires

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Bernard Bergeron
Guest





PostPosted: Tue May 11, 2004 8:02 pm    Post subject: questions élémentaires Reply with quote



Pour ne pas trop encombrer, je pose mes questions (de débutant) en une fois
:
1. j'implémente l'exemple classique (il me semble en tous cas!) du type
Pile, dans la fonction dépile :

ligne1: void depile(Pile& p){
ligne2: Pile_elt* nouveau=p.tete;
ligne3: p.tete=p.tete-> suivant;
ligne4: delete nouveau;}


----> je ne comprends pas quand on doit utiliser le symbole . et le
symbole -> ?
----> quel est l'intérêt des lignes 2 et 4, pourquoi ne pas écrire
uniquement la ligne 3?

2. quand doit-on écrire :
Pile_elt* nouveau=new Pile_elt;
ou :
Pile_elt* nouveau

ne ne vois pas vraiment la différence...



Back to top
Twxs
Guest





PostPosted: Tue May 11, 2004 8:40 pm    Post subject: Re: questions élémentaires Reply with quote



Bernard Bergeron wrote:

Quote:
1. j'implémente l'exemple classique (il me semble en tous cas!) du type
Pile, dans la fonction dépile :

ligne1: void depile(Pile& p){
ligne2: Pile_elt* nouveau=p.tete;
ligne3: p.tete=p.tete-> suivant;
ligne4: delete nouveau;}


----> je ne comprends pas quand on doit utiliser le symbole . et le
symbole -> ?
la -> quand la variable est un pointeur, le . lorsque c'est un objet ou

une référence

Quote:
----> quel est l'intérêt des lignes 2 et 4, pourquoi ne pas écrire
uniquement la ligne 3?
tu as besoin de detruire (pour liberer la memoire allouee) l'element au

sommet de la pile lorsque tu depiles.
dans ton cas p.tete pointe sur un emplacement en memoire, si tu ne mets
que la ligne 2, tu ne pourras plus deleter l'ancienne tete

Quote:

2. quand doit-on écrire :
Pile_elt* nouveau=new Pile_elt;
pour creer un nouvel element
ou :
Pile_elt* nouveau
pour acceder a un element existant (deja alloue)

ne ne vois pas vraiment la différence...




Back to top
Jean-Noël Mégoz
Guest





PostPosted: Tue May 11, 2004 11:30 pm    Post subject: Re: questions élémentaires Reply with quote



"Bernard Bergeron" <bergeron.trash (AT) free (DOT) fr> a écrit dans le message de
news:40a12ff1$0$31941$626a14ce (AT) news (DOT) free.fr...
Quote:
Pour ne pas trop encombrer, je pose mes questions (de débutant) en une
fois
:

Je me trompe peut-être, mais la réponse déjà donnée à ce message me parait
un peu laconique pour être vraiment comprise par un novice. Car ce sont en
effet des questions de novice !

Quote:
1. j'implémente l'exemple classique (il me semble en tous cas!) du type
Pile, dans la fonction dépile :

ligne1: void depile(Pile& p){
ligne2: Pile_elt* nouveau=p.tete;
ligne3: p.tete=p.tete-> suivant;
ligne4: delete nouveau;}

----> je ne comprends pas quand on doit utiliser le symbole . et le
symbole -> ?

Pour accéder à un membre d'un objet (ou d'une référence comme, ici, p), on
utilise le point. Si on écrivait "tete.suivant", ça voudrait dire qu'on veut
accéder au membre "suivant" de "tete". Or un pointeur n'a pas de membre :
c'est un type simple, au même titre qu'un entier par exemple, une variable
qui sert à stocker l'adresse mémoire d'un objet.
On utilise donc la flèche dans "tete->suivant" pour dire < "suivant" de l'objet pointé par "tete">>.

Quote:
----> quel est l'intérêt des lignes 2 et 4, pourquoi ne pas écrire
uniquement la ligne 3?


Si on n'écrit que la ligne 3, la pile change bien de tête, mais alors
l'adresse l'objet pointé initialement par "p.tete" est perdue, et il est
impossible de faire le delete voulu pour libérer la mémoire qu'il occupe.
La ligne 2 sert donc à garder temporairement l'adresse de la tete intiale.
Ceci dit, nommer ce pointeur "nouveau" n'est pas l'idéal dans ce cas car il
pointe sur un objet qui n'a rien de nouveau. J'aurais trouvé plus judicieux
d'écrire :
Pile_elt* ancienne_tete = p.tete;
p.tete = p.tete-> suivant;
delete ancienne_tete;

Quote:
2. quand doit-on écrire :
Pile_elt* nouveau=new Pile_elt;
ou :
Pile_elt* nouveau

ne ne vois pas vraiment la différence...


La différence est que "nouveau" est initialisé dans le 1er cas et pas dans
le 2nd.
— "Pile_elt* nouveau = new Pile_elt;" crée un nouvel objet de classe
Pile_elt, et stocke son adresse mémoire dans un pointeur nommé "nouveau".
— "Pile_elt* nouveau;" crée un pointeur nommé "nouveau" mais ne lui donne
pas de valeur. Il faudra ensuite l'initialiser en le faisant pointer sur un
objet de classe Pile_elt.

Tu pourrais renconter aussi la notation "Pile_elt nouveau;", qui créerait un
objet de classe Pile_elt, nommé "nouveau".
Pour connaitre l'adresse de cet objet, il faudrait écrire "&nouveau". Ainsi
:
Pile_elt nouvel_objet;
Pile_elt* nouveau_pointeur;
nouveau_pointeur = &nouvel_objet;



Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.