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

Langage C++ Discussion :

Appel fonction dans classe enfant


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Appel fonction dans classe enfant
    Bonjour, j'ai une classe qui peut contenir des composants enfants, lors de la gestion d'événements je passe les événements aux composants enfants comme ceci.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    virtual void pushEvent(sf::Event event) {
           for (unsigned int i = 0; i < children.size(); i++) {
                 children[i]->pushEvent(event);
           }
    }

    Le soucis est que pour les composants enfants, la méthode pushEvent n'est pas appelée.

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void TextArea::pushEvent (sf::Event event) {
                    LightComponent::pushEvent(event);
                    //N'affiche rien, méthode pas appelée.
                    if (tmp_text == "test")                  
                        std::cout<<"push event!"<<std::endl;
                    getListener().pushEvent(event);
                }

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Es-tu certain que ton composant est dans ton vector?
    Es-tu certain que ton tmp_test=="test"?
    Es-tu certain que la fonction parente doivent être virtual? (je te pose la question, parce que dans la lib de GUI que je viens de développer, en SFML, ce n'est pas nécessaire)

    Pourquoi ne transmets-tu pas une référence (constante) de l'événement à la fonction?
    En effet, la boucle d'événements doit être faite dans le thread d'affichage, et tout temps perdu réduit la réactivité.
    un sf::event est une structure assez conséquente pour mériter une référence.

    Et ta conception est limitée à un unique observateur (getListener) par composant. C'est dommage, à moins de le renommer en controleur, et de permettre à celui-ci d'avoir plusieurs observateurs

    Ton code pourrait ressembler à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void TextArea::do_pushEvent (sf::Event const& event) {
    //pas la peine d'appeler la fonction parente, do_pushEvent est protected virtual, et est appelée par LightEvent::pushEvent qui n'est pas virtuelle.
        Listenable::pushEvent(event);
    #ifndef NDEBUG
        std::cout<<"push event!"<<std::endl;
    #endif
    }
    edit, au passage, pour itérer un vecteur, avec un compilateur de moins de 5 ans, on écrit plutot for(auto const& child: chilren).
    La référence constante portant sur les pointeurs, pas forcément les pointés (ca dépend du type de pointeur utilisé).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Es-tu certain que ton composant est dans ton vector?
    Oui vu qu'il s'affiche.

    Es-tu certain que ton tmp_test=="test"?
    Oui

    Es-tu certain que la fonction parente doivent être virtual? (je te pose la question, parce que dans la lib de GUI que je viens de développer, en SFML, ce n'est pas nécessaire)
    Non elle ne doit pas être nécessairement virtuelle.

    Pourquoi ne transmets-tu pas une référence (constante) de l'événement à la fonction?
    Oui, je pourrais.

    Et ta conception est limitée à un unique observateur (getListener) par composant. C'est dommage, à moins de le renommer en controleur, et de permettre à celui-ci d'avoir plusieurs observateurs
    Ce n'est pas un observateur étant donné que je ne l'utilise que pour gérer les événements propre au composant, pas les événements utilisateur. (C'est juste un interpréteur de commandes)
    Si l'utilisateur souhaite faire plusieurs observateurs il doit juste créer une interface (Par exemple l'interface ActionListener) en prenant soin de définir la méthode abstraite qui devra être redéfinie lors du déclenchement de l'événement.

    Par contre j'ai modifié le code des text area, pour que la gestion du focus soit automatique et donc que l'utilisateur n'est plus à s'occuper de cela.

    edit, au passage, pour itérer un vecteur, avec un compilateur de moins de 5 ans, on écrit plutot for(auto const& child: chilren).
    La référence constante portant sur les pointeurs, pas forcément les pointés (ca dépend du type de pointeur utilisé).
    Je n'aime pas utiliser auto, je préfère toujours connaître le type de l'objet.

    Ce qui est bizarre c'est que je n'ai que ce problème pour le composant de type panneau, pour les autres composants la méthode est bien appelée.

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si tu ne veux pas utiliser auto, tu peux aussi écrire for (my_own_ptr<child> const& child : children).
    auto est la solution la plus propre, car la variable sera forcément du bon type. Mais il n'est pas nécessaire.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok.

    Bref je trouve ça bizarre quand même que la fonction pushEvent est appelée pour une classe dérivée mais pour l'autre classe dérivée elle ne l'est pas.

    Bref je laisse donc ceci en suspens jusqu'à ce que je comprenne pourquoi.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si on avait un peu plus de code, on pourrait te dire.
    Tu n'aurais pas du masquage, une faute de frappe dans le nom?

    Rajoute un message dans la fonction de la classe de base.

Discussions similaires

  1. Ne pas appeler la seconde fonction si la premiere return false
    Par dabaton dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 22/04/2010, 21h43
  2. Shell interprete une fonction que je n'ai pas appelé
    Par boulhous dans le forum Administration système
    Réponses: 4
    Dernier message: 15/02/2010, 12h22
  3. Ne pas appeler une fonction sur un évènement
    Par beegees dans le forum VB 6 et antérieur
    Réponses: 0
    Dernier message: 01/06/2009, 11h32
  4. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  5. fonction checkbox_click appelée aussi quand on clique pas
    Par janojano dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 22/01/2009, 13h05

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