IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

le pointeur this sait sur quoi pointer ?


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut le pointeur this sait sur quoi pointer ?
    Bonjour à toutes et à tous,
    Voici un code généré par Qt Creator :
    fichier mainwindow.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow) // parent pointe vers rien dans la déclaration de la fonction
    {
        ui->setupUi(this);    
    }
    On a donc le constructeur de la classe MainWindow. Quand je pointe le curseur de la souris sur ui entre les accolades, cela marque le type "Ui::MainWindow".
    Maintenant quand je pointe le curseur sur this il est marqué "Mainwindow". Au début cela ne me choquait pas : cela n'est que récemment que j'ai compris que les deux types Ui::MainWindow et MainWindow étaient différents. Bref...*

    Ensuite quand je regarde le fichier main.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w; // appel du constructeur pour construire l'objet w
        w.show(); // affichage de la fenêtre   
        return a.exec();
    }
    ça a fait tilt : en fait le this pointe sur l'objet w !
    Mais c'est là où je coince : comment this sait que c'est sur w de type MainWindow qu'il faut pointer, alors qu'à l'appel du constructeur, l'objet est en cours de création, donc pas achevé ? Merci et passez une bonne journée.

  2. #2
    Membre émérite Avatar de 10_GOTO_10
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 890
    Par défaut
    Dans toutes les fonctions membres d'une classe (constructeur et destructeur compris), le this est passé en paramètre caché. Le compilateur le rajoute automatiquement.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par gizmo27 Voir le message
    Mais c'est là où je coince : comment this sait que c'est sur w de type MainWindow qu'il faut pointer, alors qu'à l'appel du constructeur, l'objet est en cours de création, donc pas achevé ? Merci et passez une bonne journée.
    L'objet a beau être en cours de création, toutes les données qui sont nécessaire à son instanciation sont déjà allouées.
    Ainsi, l'objet a une existence propre juste avant l'appel au constructeur.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Pardon mais je n'ai toujours pas compris : vous dites que l'objet existe avant d'être construit : c'est paradoxal non ? Une maison n'existe pas avant qu'elle soit finie d'être construite : sinon elle est en cours de construction (40%, 50%) : elle existe certes mais n'est pas complète donc on ne peut pas l'utiliser : si par exemple le raccordement à EDF n'est pas fait alors on ne peut pas brancher la TV ou le PC afin de poster un message concernant le pointeur this mdr ...
    Non ? Pardonnez-moi mais ça me choque.

  5. #5
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour gizmo27

    Ne confond pas les choses :
    - quand tu places ta souris sur "this" et que Qt Creator t'indique le type, c'est juste une fonctionnalité de Qt Creator, qui parcourt ton code pour connaître le types.
    - this est forcement un pointeur vers la classe qui le contient. Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow) // parent pointe vers rien dans la déclaration de la fonction
    {
        ui->setupUi(this);    // on est dans la classe MainWindow donc this est de type MainWindow*
    }
    - quelques petites précautions à prendre du l'utilisation de this dans un constructeur : FAQ C++

    Bonne continuation

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En fait quand tu est dans le corps du constructeur, l'objet est déjà quasi construit, en tout cas il est entièrement fonctionnel. Pour reprendre ton analogie avec la bâtiment, quand tu est dans le corps du constructeur, tout le gros oeuvre est déjà fait, la maison est déjà fonctionnelle, et le constructeur est là pour te permettre de faire des travaux de finition, changer les papiers peints. Est ce n'est qu'après ces travaux finis qu'on va donner un nom (w) à cette maison.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ah ok je comprend mieux : mais c'est "balèze" ça dites-moi... ? Une chose qui cloche : je ne peux pas rentrer dans le corps du constructeur : ça impliquerait que je prenne un bistouri, que j'ouvre son corps et que j'entre : je ne suis pas le genre à faire ça c'est immoral ! De plus j'ai besoin du constructeur pour finir la maison Bonne journée et bon appétit !
    PS : ne lisez pas mon post si vous mangez

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    F.A.Q. : Dans quel ordre sont construits les différents composants d'une classe ?
    => Le code entre {} de ton constructeur est exécuté après que les membres et les classes de bases soient construits.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup pour le lien. Bonne journée.

  10. #10
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Si tu veux intervenir sur ta maison au moment ou on creuse les fondations (décidément les dev sont dans le btp) tu peux faire ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    maclasse::maclasse() :
    attribut1(42),  /* juste après l'allocation mémoire de ton objet tu définie comment sont construits ses attributs (très pratique !) */
    attribut2("hello !!!")
    {
        /* ici on meuble la zolie maison :D
        les attributs sont déja initialisé tout ce que tu fais ici c'est de l'affectation enfaite */
    }

  11. #11
    Invité
    Invité(e)
    Par défaut
    D'habitude les membres postent quand ils ont des questions (même moi d'ailleurs au passage) : mais là je vais faire une exception : là pour dire que je suis content de cette journée j'ai appris plein de choses : entre autres que l'on ne peut rentrer dans le corps du constructeur même muni d'un bistouri...
    Non sans rire merci pour vos réponses et vos différents avis : ça permet de se faire une idée.
    Aujourd'hui je suis content : j'ai crée ma première connexion signal/slot Qt, avec passage de paramètres ! Que du bonheur ! D'autant plus que j'étais resté bloqué dessus un moment. Ca fait plaisir quand on a trouvé par soi-même... Mais je ne vous apprend rien
    Encore merci ! Et vive les constructeurs ! Et même du BTP mdr !

  12. #12
    Membre très actif Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Par défaut
    Si les membres n'intervenaient que pour poser des questions le principe même de forum aurait la vie dure
    Mais ce n'est pas anormal de ne pas trop participer quand on est débutant ^^

  13. #13
    Invité
    Invité(e)
    Par défaut
    D'autant plus que je trouve que ça n'est pas une "question idiote" et je suppose que ça a traversé l'esprit de plus d'un non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Question sur le pointeur this
    Par Core8 dans le forum C++
    Réponses: 4
    Dernier message: 29/03/2007, 14h31
  2. pointeur this - c++ builder
    Par mathieu57 dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/03/2006, 14h19
  3. Pointeur de fonctions sur méthode
    Par Glosialabolas dans le forum C++
    Réponses: 9
    Dernier message: 04/12/2005, 14h55
  4. Problème de boot , ne sait plus quoi faire ...
    Par timZeR0 dans le forum Administration système
    Réponses: 3
    Dernier message: 02/12/2005, 18h01
  5. [MFC] Pointeur this et fonctions statiques
    Par Yellowmat dans le forum MFC
    Réponses: 5
    Dernier message: 08/02/2005, 10h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo