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 :

Précisions sur le mot clé virtual protected


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Précisions sur le mot clé virtual protected
    Bonjour,

    J'aimerais quelques précisions sur comment fonctionne le mot clé virtual protected.
    En fait j'ai l'impression de confondre membre d'une classe et objet instancié par la classe.
    A travers mon exemple j'essaierai de vous expliquer ce que j'ai compris intuitivement.
    Alors voilà : d'abord il y a ma classe MainWindow :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
     
    public:
        explicit MainWindow(QWidget *parent = 0);    
        ~MainWindow();
     
    private:
        Phonon::VideoWidget vw;
    };
    Ici je l'intéresserai à la fonction mousedoubleclick() qui est virtual protected (peu importe les paramètres ici).

    Un peu plus loin dans le code je fais ceci à l'intérieur d'une fonction membre privée de ma classe MainWindow :Et là le compilateur bloque et dit que la fonction mousedoubleclick() est protected.

    Voilà maintenant ce que j'ai compris (mais je ne suis vraiment pas sûr du tout) :

    => un objet instancié de type Phonon::VideoWidget n'est pas membre de cette classe ? Il contiendra les membres (fonctions, variable) mais n'en n'est pas un ?

    => vw est de type VideoWidget et membre privé de MainWindow : est-ce parce que vw est privé que le compilo bloque ?

    => virtual protected signifie que la fonction est utilisable par les membres de la classe mais peut l'être aussi par les membres des classes dérivées ?

    Je ne suis pas sûr du tout de ça. Si vous pouvez m'éclairer sur ces 3 points je vous remercie je sens que c'est un concept très important.

    En fait dans le code voilà ce que j'ai compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Phonon::VideoWidget vw; // dans la classe MainWindow je crée un objet de type VideoWidget (cet objet est membre de la classe MainWindow)
    (...)
    vw.mousedoubleclick(); // à l'intérieur d'un membre de MainWindow j'appelle une fonction virtual protected appartenant à une classe extérieure à MainWindow
    Bonne journée. Cordialement, Gizmo.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut
    Tout d'abords le sens des mots clefs 'virtual' et 'protected' n'est pas lié (Cf la FAQ C++ pour les détails).
    Ici, c'est 'protected' qui est intéressant:
    Cela signifie que ta méthode ne peut être appelée que par un objet de la classe (ici, Phonon::VideoWidget) ou un objet dont la classe hérite de Phonon::VideoWidget. En aucun cas cette méthode mousedoubleclick() ne peut être appelée depuis un objet de classe MainWindow, même si l'objet Phonon::VideoWidget est membre de MainWindow.
    'Être membre' ne signifie pas 'hériter de'!

  3. #3
    Invité
    Invité(e)
    Par défaut
    D'accord merci à toi.
    Donc même si je mets mon objet vw en public cela n'y changera rien-du-tout ?

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2010
    Messages : 7
    Par défaut
    Mettre vw en public aura pour effet de rendre le vw accessible aux objets qui utiliseraient ta classe MainWindow. On alors pourrai faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MainWindow win;
    win.vw.methodeDeVideoWidget();
    ...ce qui n'est pas ce que tu veux ici.
    Ici, la methode Phonon::VideoWidget::mousedoubleclick() est déclarée protected, donc pour l'utiliser depuis l'extérieur de VideoWidget, il faut que t en "donne l'accès".
    Pour cela il te faut définir ta propre classe de VideoWidget (par exemple MyVideoWidget), qui hérite de VideoWidget : cette classe aura accès à la méthode mouseDoubleClick de VideoWidget. Il suffit alors d'encapsuler l'appel à VideoWidget::mouseDoubleClick () dans une méthode publique de MyVideoWidget:
    Par exemple tu pourrais faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class MyVideoWidget : public Phonon::VideoWidget
    {
     public:
       void mouseDoubleclick();
    }
     
    MyVideoWidget::mouseDoubleclick()
    {
    //....
     VideoWidget::mouseDoubleclick();
    //....
    }

  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
    Je suppose que tu parles de la foncton mouseDoubleClickEvent ?

    C'est normal qu'elle soit en protected... car le but est de ne pas pouvoir l'appeler directement.

    Le but des fonctions xxxEvent est de faciliter la gestion des events pour l'utilisateur final. Il suffit de redéfinir dans ces fonctions le comportement que l'on souhaite implémenter, le reste (capture d'un évènement généré par l'utilisateur ou autre, création du QEvent correspondant, traitement des events, dispatching des events, etc.) est réalisé automatiquement pas Qt.

    Donc si tu veux simuler un double clic, il ne faut pas appeler cette fonction, il faut créer un QMouseEvent de type QEvent::MouseButtonDblClick et l'envoyer à la boucle d'event avec QCoreApplication::postEvent.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ok alors j'avais à peu près tout compris alors... Ou presque...

    Par contre pour le QMouseEvent j'avais deviné mais pas pour QCoreApplication... D'ailleurs si vous ne l'aviez pas dit je n'aurai jamais deviné.

    Ca a l'air assez difficile à faire cependant mais on doit "jubiler" quand on sait le faire.

    Aussi j'avais l'intention de créer mon propre signal avec la classe QSignalMapper (je ne sais pas trop j'ai vu ça je ne sais plus trop où...), mais à l'heure qu'il est je ne sais pas encore vers quelle solution me tourne, tout débutant newbie des prairies que je suis...

    PS : j'aimerais être sûr pour l'encapsulation : sur la FAQ il est dit que, je cite
    Un membre déclaré public dans une classe peut être accédé par toutes les autres classes et fonctions.
    Donc pour mon exemple, si vw de classe VideoWidget est public dans MainWindow alors le code suivant marche non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this->vw.mouseDoubleClickEvent();
    Dernière modification par Invité ; 19/07/2011 à 17h59.

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

Discussions similaires

  1. demande de précision sur le mot-clef volatile
    Par archimondain dans le forum Threads & Processus
    Réponses: 13
    Dernier message: 01/03/2012, 19h27
  2. Précision sur Oracle 9iAS r2
    Par Patmane dans le forum Oracle
    Réponses: 9
    Dernier message: 18/03/2007, 04h41
  3. Précisions sur Import/export
    Par electro dans le forum Import/Export
    Réponses: 9
    Dernier message: 15/10/2004, 13h34
  4. [Observateur] Précisions sur le design pattern Observer [UML]
    Par joquetino dans le forum Design Patterns
    Réponses: 2
    Dernier message: 07/10/2004, 22h35
  5. Précision sur les sauvegarde à chaud
    Par alxkid dans le forum Administration
    Réponses: 2
    Dernier message: 09/08/2004, 18h55

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