Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
726 connectés 

  FORUM HardWare.fr
  Programmation

  programmeur passant de C à C++, j'arrive pas à assimiler (this)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

programmeur passant de C à C++, j'arrive pas à assimiler (this)

n°16414
la viper
Posté le 28-02-2001 à 21:36:03  profilanswer
 

programmeur passant de C à C++, j'arrive pas à assimiler (this)
 
qq un pourrait-il m'expliquer de facon simple son role SVP ??

mood
Publicité
Posté le 28-02-2001 à 21:36:03  profilanswer
 

n°16423
xilebo
noone
Posté le 28-02-2001 à 22:23:40  profilanswer
 

"this" représente le pointeur d'une instance de classe. On n'utilise ce terme que dans des fonctions membres ( aussi appelées méthodes) d'une classe. ( this n'a aucune signification dans une fonction n'appartenant à aucune classe).
 
Un des interets de "this", c'est par exemple  lorsque tu appelles une fonction quelconque dans ta classe et que tu as besoin de passer en parametre de cette fonction le pointeur sur une instance de ta classe , tu utilises alors "this".

n°16432
la viper
Posté le 28-02-2001 à 23:20:39  profilanswer
 

je crois que je saisi le truc merci ... et je crois surtout que je vais devoir faire des exos dessus.
 
C'est assez frequent le This ??

n°16433
verdoux
And I'm still waiting
Posté le 28-02-2001 à 23:24:25  profilanswer
 

Fréquent ? Non pas forcément dans le code mais il est forcément présent dans la tête du codeur puisque c'est l'objet intéressant quand on appelle une fonction membre non statique.

n°16435
BifaceMcLe​OD
The HighGlandeur
Posté le 28-02-2001 à 23:30:56  profilanswer
 

Pour schématiser (et simplifier beaucoup), une classe, c'est une structure C avec des fonctions (dites fonctions-membres, ou méthodes dans la terminologie objet).
 
De façon générale, les méthodes d'une classe sont là pour manipuler les objets (ou instances) de cette classe. Quand on appelle une méthode (on dit qu'on l'invoque), on appelle toujours une méthode sur une instance donnée.
Exemple, tu as une classe Date, dans laquelle une méthode "int annee()" est définie (dois-je préciser ce que cette méthode sans paramètre fait ? ;) ).
 
Maintenant, dans ton programme principal, tu vas écrire :
    Date  aujourdhui;
 
    cout << "Nous sommes en l'an de grâce " << aujourdhui.annee();
Tu appliques la méthode annee() à l'objet aujourdhui.
 
Et la méthode annee(), comment elle fait pour retrouver l'objet sur lequel elle a été appliquée (cet objet appelé l'objet receveur), hein ?  :??:  
 
Ben avec this, précisément. :sol:
 
Note: Attention, this est un pointeur sur l'objet receveur. Donc tu accèdes à l'objet par *this, et à ses champs-membres (à ses attributs) par this-> .... Comme pour tout pointeur qui se respecte, quoi...  ;)

n°16436
BifaceMcLe​OD
The HighGlandeur
Posté le 28-02-2001 à 23:38:30  profilanswer
 

la viper a écrit a écrit :

C'est assez frequent le This ??




Je sais que ce n'est pas une convention très courante, mais moi, dans mes programmes C++, j'ai l'habitude de toujours accéder aux attributs de ma classe en utilisant explicitement this.  
 
Ca permet de savoir tout de suite où a été déclaré l'identifiant qui suit, et de le différencier d'un seul coup d'oeil des variables locales et globales. Idem pour les appels de méthodes, ce qui permet de distinguer facilement les appels aux méthodes de la classe courante des appels à des fonctions C classiques.
 
Vous allez me dire pourquoi faire, tout ça : tout simplement pour pouvoir savoir où chercher quand il s'agit d'aller retrouver où est-ce que ce maudit identifiant a été déclaré et/ou défini... (et quand il s'agit de déboguer du code que quelqu'un d'autre a écrit, c'est méchamment utile...)

n°16437
la viper
Posté le 28-02-2001 à 23:45:32  profilanswer
 

je crois saisir encore un peu plus la chose/
 
mais imaginons
 
 class date{
private:
int annee;
int mois;
int jour;
public:
int date::annee()
{
return annee;
}
}aujourdhui;
 
void main(void)
{
cout << aujourdhui.annee();
}
 
ca va bien me donner l'année mais je vois pas ou intervient this ici !!
 
 
j'suis bete ? ou ai je loupé un chapitre de mon bouquin ?

n°16442
oh_damned
Posté le 01-03-2001 à 00:03:43  profilanswer
 

en fait le this est implicite et dans la pratique l'ajouter sert surtout à améliorer la lisibilité du programme (il prend tout son intéret pour le compilateur mais là n'est pas la question)
 
ex :
 
class Silly{
  int bob;
public :
  int getbob();
}
 
int Silly::getbob(){
  return bob; //equivalent à return this->bob
}
 
void main(){
  Silly s;
//...
  cout<<"bob ="<<s.getbob()<<"\n";  
//...
}
 
si implicitement this n'était pas passé à getbob
la fonction n'aurait aucun moyen d'accéder aux attributs de l'objet qui l'appelle
:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D

n°16449
BifaceMcLe​OD
The HighGlandeur
Posté le 01-03-2001 à 01:10:27  profilanswer
 

la viper a écrit a écrit :

 
...
 
ca va bien me donner l'année mais je vois pas ou intervient this ici !!




Je vais réécrire un poil ta classe, si tu permets :
 
class Date {  
    private:  
        int annee;  
        int mois;  
        int jour;  
 
    public:  
        int annee();
};  
 
int Date::annee()
{
    return this->annee;
}
 
void main(void)  
{
    Date aujourdhui;
 
    cout << aujourdhui.annee();  
}

n°16462
SoWhatIn22
Posté le 01-03-2001 à 08:50:57  profilanswer
 

>en fait le this est implicite et dans la pratique l'ajouter  
>sert surtout à améliorer la lisibilité du programme (il > prend tout son intéret pour le compilateur mais là n'est pas
> la question)  
 
hum... pas du tout d'accord avec toi...
 
Le 'this' n'est pas fait que pour le compilateur. Regarde par exemple comment est écrit le constructeur de recopie d'une classe...
Ya évidement plein d'autres cas ou tu ne peux pas t'en passer (je pense notament a un objet O1 qui va créer un autre objet o2, et qui doit lui passer un pointeur a la construction pour que cet objet o2 puisse par la suite appeler une méthode publique de O1).
 
Donc même si c'est vrai qu'on peut souvent se passer de 'this' dans le code, il n'est pas fait que pour le compilo, loin s'en faut...

mood
Publicité
Posté le 01-03-2001 à 08:50:57  profilanswer
 

n°16499
oh_damned
Posté le 01-03-2001 à 11:49:51  profilanswer
 

j'ai dit : "l'ajouter sert SURTOUT à améliorer la lisibilité du programme " mais je n'ai pas dit qu'il ne servait qu'à ça, son utilisation est très rarement obligatoire c tout, mais je n'ai pas dit qu'elle nétait jamais obligatoire !!!!!
 
:hot::hot::hot::hot::hot::hot::hot:

n°16582
la viper
Posté le 01-03-2001 à 20:42:28  profilanswer
 

cimer !!!! j'viens de comprendre MERCI à tous !!!! :pt1cable:  :sarcastic:  :crazy:  :sol:  :hap:  :love:  :benetton:  :bounce:

n°16592
Roswell_
Posté le 01-03-2001 à 22:38:19  profilanswer
 

Sinon un des coup classique d'utilisation de this c'est dans les listes chainées d'objets.
chaque objet liste a un pointeur sur un objet et un pointeur sur un objet liste éventuelle.
 
class liste
{
public:
  //proprietes
  liste *next;
  void *obj;
  //constructeurs
  liste(void *o):next(NULL),obj(o){}
  //methodes
  liste *addItem(void *o)
  {
    liste *newLst=new liste(o);
    newLst->next=this;
    return newLst;
  }
};
 
Sinon en ce moment je m'en sert dans mes algo de collision pour un p'tit jeux. la balle détecte la collision mais la réaction est différente suivant l'objet rencontré donc chaque methode de gestion des collisions recoit un pointeur sur la balle.
La balle detecte la collision avec un objet et passe le pointeur this a l'objet qu'elle a rencontré pour le traitement.


---------------
http://www.cheata.net le site qui vous donne la banane!
n°16593
verdoux
And I'm still waiting
Posté le 01-03-2001 à 22:42:12  profilanswer
 

Beurk des "void *", c'est pas c++ ça, les templates c'est pas pour les chiens :)
Et pis il y a les listes de la STL.

n°16600
la viper
Posté le 01-03-2001 à 23:25:27  profilanswer
 

Roswell :
 
okok, ... juste une chose, ici ton this represente quelle liste .. celle qui vient juste d'etre cree (new liste(o) ) ou celle qui a appelé addItem ???

n°16608
la viper
Posté le 01-03-2001 à 23:52:40  profilanswer
 

hum : je dirais que this pointe vers la liste qui lance addItem et que celle-ci est copié dans la nouvelle liste...
 
c'est ça ?
 
un peu comme un arbre (ou liste)
     A
    / \
   B   D
  / \ / \
 C
/ \

n°16618
BifaceMcLe​OD
The HighGlandeur
Posté le 02-03-2001 à 01:21:13  profilanswer
 

la viper> Attention à ne pas tout confondre. Une liste est une structure à une dimension :
   A -- B -- C -- D
Chaque noeud a un seul noeud suivant (une seule cellule suivante, si vous préférez le terme de cellule. Ou éventuellement zéro, quand c'est le dernier noeud de la liste).
 
Ce que tu as dessiné est un arbre (tu as remarqué qu'il était à 2 dimensions....). En l'occurrence, ici, c'est un arbre binaire, c'est-à-dire que chaque noeud a deux noeud suivants (en général, on parle d'ailleurs plutôt de 2 noeud fils ou 2 cellules filles, car on s'y retrouve plus facilement).
 
Donc:
    class List {  
       List*  next;  
       void*  obj;  
        ...
    }
ça, c'est une liste.
 
    class BinaryTree {  
       BinaryTree*  left;  
       BinaryTree*  right;  
       void*        obj;  
        ...
    }
Et ça, c'est un arbre binaire.

n°16619
BifaceMcLe​OD
The HighGlandeur
Posté le 02-03-2001 à 01:23:41  profilanswer
 

Verdoux a écrit a écrit :

Beurk des "void *", c'est pas c++ ça, les templates c'est pas pour les chiens :)
Et pis il y a les listes de la STL.




Ouaip. Sauf que même si c'est souvent une bonne idée de ne pas réinventer la roue, il y a des structures de données qu'il fait toujours bon savoir (ré-)implémenter...  ;)

n°16654
Roswell_
Posté le 02-03-2001 à 12:49:42  profilanswer
 

la viper>
le this désigne l'objet liste qui a appelé addItem.
Cet objet n'est pas vraiment une liste c'est plutot comme l'a dit BifaceMcLeOD une cellule qui à un pointeur sur un objet et un pointeur vers éventuellement une autre cellule.
 
Mais comme on garde le pointeur (addItem renvoie liste *) sur la premiere cellule, on peut bien récuperer tout les autres cellules qui forment ta liste.


---------------
http://www.cheata.net le site qui vous donne la banane!
n°16717
la viper
Posté le 02-03-2001 à 17:43:08  profilanswer
 

oki doky !
 
merci à tous ...
 
au plaisir de vous relire dans un autre topic  :jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  programmeur passant de C à C++, j'arrive pas à assimiler (this)

 

Sujets relatifs
Access 2000 : ou comment je n'y arrive pasQuel avenir pour un programmeur ???
[JScript] GRR j'arrive pas à trouver un rollover text multibrowser!*** Rech programmeur php ***
Plus de sujets relatifs à : programmeur passant de C à C++, j'arrive pas à assimiler (this)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR