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 :

Warning lors du this passé dans un constructeur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Par défaut Warning lors du this passé dans un constructeur
    Bonjour à tous,
    Je suis en train de créer des classes pour encapsuler des APIs Windows.

    Pour simplifier, j'ai une classe MainWindow qui hérite de Window et une classe Button.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MainWindow : public Window
    {
    private:
       Button btnEssai;
    };
    
    MainWindow::MainWindow() : btnEssai(*this) // Pour connaître la fenêtre parente
    {}
    Mais j'ai un warning lors du passage de this dans le constructeur de btnEssai.
    Dans mon implémentation actuelle, le bouton est créé sur la fenêtre parente dans son constructeur et je n'ai absolument aucun problème mais ce warning m'embete.

    Avez-vous une idée pour éviter cela?

    Merci d'avance,
    Nicolas

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    This n'existe qu'une fois dans le constructeur. Dans la liste d'initialisation, il n'existe pas... d'où warning et plantage à venir.

  3. #3
    Invité
    Invité(e)
    Par défaut
    pourquoi tu essaye de construire un objet a partir de lui meme ?

    apparemment, c'est pour que ton bouton connaisse son parent (d'apres ton commentaire). donc l'initialization list est hors jeu pour toi dans ce cas. as tu essayé de déplacer l'initialisation de ton bouton dans le corps du constructeur ?
    sinon, ton bouton n'aurais pas par hasard une methode create() qui fait la meme chose, mais apres la construction ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Par défaut
    Miles > il semblerait que le compilateur de visual studio définisse déja le this avant la liste d'initialisation donc pour le moment pas de problème, enfin du moins avec des objets non alloués dynamiquement...

    toxcct > Si je déplace l'initialisation de mon bouton dans le corps du constructeur je serais obligé de jouer avec des pointeurs sans compter les couples new/delete, ce que je trouve un peu lourd...
    Sinon une solution serait effectivement d'implémenter une méthode Create ou Init mais dans ce cas je devrais, pour chaque objet créé, appeller cette méthode. Ce que je trouvais un peu lourd aussi...

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par NicolasJolet
    Miles > il semblerait que le compilateur de visual studio définisse déja le this avant la liste d'initialisation donc pour le moment pas de problème, enfin du moins avec des objets non alloués dynamiquement...

    toxcct > Si je déplace l'initialisation de mon bouton dans le corps du constructeur je serais obligé de jouer avec des pointeurs sans compter les couples new/delete, ce que je trouve un peu lourd...
    Sinon une solution serait effectivement d'implémenter une méthode Create ou Init mais dans ce cas je devrais, pour chaque objet créé, appeller cette méthode. Ce que je trouvais un peu lourd aussi...
    Ce n'est pas un comportement standard, c'est un truc à éviter au maximum...
    Garde-le dans la liste des initialisations - sinon, c'est le constructeur par défaut qui est appelé -, puis dans le constructeur parent, appelle une fonction du bouton pour placer le père.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par NicolasJolet
    Si je déplace l'initialisation de mon bouton dans le corps du constructeur je serais obligé de jouer avec des pointeurs sans compter les couples new/delete, ce que je trouve un peu lourd...
    hein ???
    pourquoi pas juste ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MainWindow::MainWindow() {
        btnEssai(*this) ;// Pour connaître la fenêtre parente
    }

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Parce que ça ne marche pas ? Initialisation = liste d'initialisation. Dans le constructeur parent, l'objet est déjà construit, alors )à moins qu'il ait une fonction operator() qui prenne un parent en paramètre...

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    413
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 413
    Par défaut
    miles > oui je pense que je ne vais pas avoir le choix, c'est un peu du "double travail" (dans le sens où il y a appel de 2 méthodes, le constructeur et la méthode Init()) mais au moins je n'aurais plus de problèmes...

    Enfin merci à tous les 2

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    C'est un problème de VC. Qui se justifie parfaitement : il te prévient que tu cours au devant de dangers. Tant que tu ne fais que donner la référence à *this pour construire un lien qui ne sera exploité que plutard par le membre construit tout va bien. Mais VC te fera tout de même un warning.

    J'avais avais parlé plus précisément ici. Mais tu as un point d'une FAQ ou d'une série de tips qui en parle quelque part. Je ne sais juste plus où.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/05/2009, 18h22
  2. Passage de this dans un constructeur
    Par Anium dans le forum C++
    Réponses: 6
    Dernier message: 26/05/2008, 15h30
  3. Réponses: 5
    Dernier message: 25/04/2008, 20h37
  4. Threads windows this est null dans le constructeur
    Par ghalaax dans le forum Visual C++
    Réponses: 1
    Dernier message: 12/12/2006, 16h57
  5. Réponses: 5
    Dernier message: 12/03/2006, 14h38

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