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

wxWidgets Discussion :

La méthode wxFrame::Create


Sujet :

wxWidgets

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut La méthode wxFrame::Create
    Bonjour.

    En imitant un exemple, j'ai dérivé de la classe wxFrame une classe MonEditeurAnsiStaticFrame dont le constructeur (qui a des arguments) ne contient pas d'appel explicite au constructeur de wxFrame (qui a aussi des arguments) mais bien un appel à la méthode wxFrameCreate(), qui a les mêmes arguments que le constructeur de wxFrame.

    Voici le code de mon constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    MonEditeurAnsiStaticFrame::MonEditeurAnsiStaticFrame(wxWindow* parent, wxWindowID id, const wxString& caption,
                               const wxPoint& pos, const wxSize& size, long style)
    {
       wxFrame::Create(parent, id, caption, pos, size, style); 
       CreerBarreMenus();
       CreerBarreDEtat();
     
       Connect(ID_ITEMMENU_APPLICATION_QUIT, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MonEditeurAnsiStaticFrame::QuidItemApplicationQuitterClic));
       Connect(ID_ITEMMENU_FICHIER_NOUVEAU, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MonEditeurAnsiStaticFrame::QuidItemFichierNouveauClic));
       Connect(ID_ITEMMENU_FICHIER_FERMER, wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler(MonEditeurAnsiStaticFrame::QuidItemFichierFermerClic));
    }
    Peu importe le sens exact des 5 dernières instructions, vous vous doutez qu'elles n'appellent pas le constructeur de wxFrame.

    Ce qui m'étonne, c'est que ce code fonctionne correctement (j'obtiens la fenêtre avec les propriétés voulues) alors que mon constructeur ne contient pas d'appel explicite au constructeur de wxFrame.
    Or un tel appel est obligatoire, puisque le constructeur de la classe mère a des arguments (Dupin, p. 233-235).

    Faut-il comprendre que l'appel à la méthode wxFrame::Create() contient lui-même un appel au constructeur de la classe mère ?
    Et au fait, que fait exactement cette méthode wxFrame::Create() ?
    La documentation dit :

    wxFrame::Create
    bool Create(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame")
    Used in two-step frame construction. See wxFrame::wxFrame for further details.
    http://www.wxwidgets.org/manuals/sta...#wxframecreate

    Il n'y a rien de plus sous wxFrame::wxFrame

    Qu'est-ce qu'une "construction en deux étapes" ?

    Merci d'avance.
    M.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En l'absence d'appel explicite au constructeur de la classe mère, c'est le constructeur par défaut qui est appelé. Comme wxFrame en possède un, il n'y a aucun problème.

    Quant à wxFrame::Create, c'est simplement un moyen de créer le widget après sa construction (il y a des situations où l'on est obligé d'utiliser le constructeur par défaut). Une "construction en deux étapes" signifie juste que plutôt que de construire et créer le widget en une fois, tu vas d'abord le construire par défaut, puis le créer explicitement.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent Gomila
    En l'absence d'appel explicite au constructeur de la classe mère, c'est le constructeur par défaut qui est appelé. Comme wxFrame en possède un, il n'y a aucun problème.

    Quant à wxFrame::Create, c'est simplement un moyen de créer le widget après sa construction (il y a des situations où l'on est obligé d'utiliser le constructeur par défaut). Une "construction en deux étapes" signifie juste que plutôt que de construire et créer le widget en une fois, tu vas d'abord le construire par défaut, puis le créer explicitement.
    Merci pour la réponse.

    OK pour l'appel d'office du constructeur par défaut de la classe de base, à condition, je suppose, que ce constructeur par défaut soit explicitement défini. Je précise cela, parce que, si je ne me trompe, il y a toujours un constructeur par défaut : s'il n'y en a pas un d'explicite, le compilateur en fabrique un.
    Mais je suppose que celui-là ne peut pas être appelé implicitement dans le constructeur de la classe dérivée.

    Pour wxFrame::Create(), je commence peut-être à voir clair, mais quelqu'un pourrait-il donner un exemple de cas où on est obligé d'utiliser un constructeur par défaut puis, par après seulement, d'indiquer par Create() les paramètres qu'on n'a pas fournis au constructeur ?

    Et au fait, la méthode Create() peut-elle être appliquée plusieurs fois de suite au même objet ? (J'imagine que non, car on voit mal un objet changer de parent ou d'identificateur, mais après tout...)

    Merci d'avance pour les réponses.

    M.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    OK pour l'appel d'office du constructeur par défaut de la classe de base, à condition, je suppose, que ce constructeur par défaut soit explicitement défini. Je précise cela, parce que, si je ne me trompe, il y a toujours un constructeur par défaut : s'il n'y en a pas un d'explicite, le compilateur en fabrique un.
    Mais je suppose que celui-là ne peut pas être appelé implicitement dans le constructeur de la classe dérivée.
    Deux choses :
    - Le constructeur par défaut ne sera pas généré automatiquement si tu en as défini d'autres
    - Le constructeur par défaut généré par le compilo n'a aucune restriction par rapport à celui que tu pourrais écrire, donc il peut bien entendu être appelé implicitement par les classes dérivées

    Pour wxFrame::Create(), je commence peut-être à voir clair, mais quelqu'un pourrait-il donner un exemple de cas où on est obligé d'utiliser un constructeur par défaut puis, par après seulement, d'indiquer par Create() les paramètres qu'on n'a pas fournis au constructeur ?
    Par exemple si tu crées un tableau de widgets, tu ne pourras pas spécifier autre chose que le constructeur par défaut.

    Et au fait, la méthode Create() peut-elle être appliquée plusieurs fois de suite au même objet ? (J'imagine que non, car on voit mal un objet changer de parent ou d'identificateur, mais après tout...)
    Aucune idée !

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent Gomila
    Le constructeur par défaut généré par le compilo n'a aucune restriction par rapport à celui que tu pourrais écrire, donc il peut bien entendu être appelé implicitement par les classes dérivées
    Bon alors la règle est peut-être celle-ci :
    On ne peut pas demander la construction d'un objet de la classe dérivée à l'aide d'arguments si le constructeur de la classe dérivée ne contient pas (explicitement) un appel au constructeur de la classe de base.

    Pourtant, ça me laisse mal à l'aise, parce que je lis dans Stroustrup, 2de éd. fr., p. 339 : "si tous les constructeurs d'une classe de base requièrent des arguments, un constructeur pour cette base doit être appelé explicitement"

    Que veut dire "si tous les constructeurs d'une classe de base requièrent des arguments", puisqu'il y a toujours un constructeur par défaut (éventuellement créé par le compilateur) ?

    Merci d'avance à qui répondra.
    M.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Mersenne
    Que veut dire "si tous les constructeurs d'une classe de base requièrent des arguments", puisqu'il y a toujours un constructeur par défaut (éventuellement créé par le compilateur) ?
    Non :
    Citation Envoyé par Laurent Gomila
    - Le constructeur par défaut ne sera pas généré automatiquement si tu en as défini d'autres

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Bon alors la règle est peut-être celle-ci :
    On ne peut pas demander la construction d'un objet de la classe dérivée à l'aide d'arguments si le constructeur de la classe dérivée ne contient pas (explicitement) un appel au constructeur de la classe de base.
    Tu te prends trop la tête
    Il n'y a pas de règle tordue, le constructeur de la classe dérivée doit juste appeler un constructeur de la classe de base, et si ce n'est pas fait explicitement alors c'est fait par implicitement via un appel au constructeur par défaut.

    Que veut dire "si tous les constructeurs d'une classe de base requièrent des arguments", puisqu'il y a toujours un constructeur par défaut (éventuellement créé par le compilateur) ?
    C'est ce que je t'ai dit dans ma réponse précédente : si tu crées au moins un constructeur prenant des paramètres, le constructeur par défaut ne sera pas généré. Donc il n'y a pas toujours un constructeur par défaut.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent Gomila
    il n'y a pas toujours un constructeur par défaut.
    Voilà un point éclairci. J'étais persuadé du contraire.
    Merci.
    M.

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Est-ce que ton problème est réglé ? Si oui n'oublie pas de cliquer sur , sinon précise-nous ce qu'il reste à éclaircir

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent Gomila
    sinon précise-nous ce qu'il reste à éclaircir
    La documentation de wxWidget dit bien que le constructeur de wxFrame est un constructeur par défaut :


    wxFrame::wxFrame
    wxFrame()
    Default constructor.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wxFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame")
    Constructor, creating the window.
    Parameters
    parent : The window parent. This may be NULL. If it is non-NULL, the frame will always be displayed on top of the parent window on Windows.
    id : The window identifier. It may take a value of -1 to indicate a default value.
    title : The caption to be displayed on the frame's title bar.
    pos : The window position. A value of (-1, -1) indicates a default position, chosen by either the windowing system or wxWidgets, depending on platform.
    size : The window size. A value of (-1, -1) indicates a default size, chosen by either the windowing system or wxWidgets, depending on platform.
    style : The window style. See wxFrame.
    name : The name of the window. This parameter is used to associate a name with the item, allowing the application user to set Motif resource values for individual windows.
    http://www.wxwidgets.org/manuals/sta...ml#wxframector

    mais il me semblait qu'on appelle constructeur par défaut un constructeur qu'on peut appeler sans arguments, soit qu'il n'ait pas d'arguments soit que ses arguments aient tous des valeurs par défaut.

    Or, à en juger par l'en-tête, les trois premiers arguments du constructeur de wxFrame ne sont pas optionnels ? Dans ce cas, est-ce vraiment un constructeur par défaut ?

    Merci d'avance à qui répondra.
    M.

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans la doc tous les constructeurs sont rassemblés dans "wxFrame::wxFrame", mais il y en a bien deux ici

    wxFrame()

    Default constructor.
    wxFrame(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxDEFAULT_FRAME_STYLE, const wxString& name = "frame")

    Constructor, creating the window.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 107
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par Laurent Gomila
    Dans la doc tous les constructeurs sont rassemblés dans "wxFrame::wxFrame", mais il y en a bien deux ici
    Merci.
    M.

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

Discussions similaires

  1. [V8] Méthode ORM create, comment l'utiliser avec la V8 ?
    Par ammine007 dans le forum Odoo (ex-OpenERP)
    Réponses: 0
    Dernier message: 04/12/2014, 09h31
  2. Réponses: 6
    Dernier message: 01/08/2010, 10h33
  3. [EJB3 Entity] Erreur lors de l'exécution de la méthode create
    Par seeif dans le forum Java EE
    Réponses: 9
    Dernier message: 17/07/2009, 17h03
  4. Problème avec la méthode Create d'un dérivé de CEdit
    Par PetitPapaNoël dans le forum MFC
    Réponses: 4
    Dernier message: 13/07/2007, 12h41
  5. Surcharger la méthode Create du composant TImage
    Par ero-sennin dans le forum Delphi
    Réponses: 27
    Dernier message: 07/03/2007, 16h29

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