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

Discussion :

Héritage protégé d'un QObjet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 74
    Par défaut Héritage protégé d'un QObjet
    Bonjour,

    J'ai une classe Server qui hérite de QTcpServer.

    Elle y ajoute des attributs privés, des accesseurs publics, des slots publics, et des signaux.
    Je ne souhaite rendre accessible depuis l'extérieur que ce qui se trouve en public dans Server.

    J'ai deux solutions :
    1. Ne plus faire d'héritage et encapsuler un QtcpServer en attribut de Server.
    2. Effectuer un héritage protected.

    Je ne souhaite pas utiliser la solution 1 car je souhaite pouvoir hériter de Server un jour, et ce jour là je voudrai que cette fille soit une petite fille de QTcpServer

    Avec la deuxième solution, l'extérieur (une GUI) obtient l'erreur
    error: ‘QObject’ is an inaccessible base of ‘Server’
    Sur les lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MainWindow::MainWindow(Server* server, QWidget *parent) :
        QMainWindow(parent), ui(new Ui::MainWindow)
    {
        qDebug() << Q_FUNC_INFO << server << parent; // <- Erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect(ui->offPushButton, SIGNAL(clicked()), _server, SLOT(switchOff()));
    Comment faire pour donner l'accès à QObject ?

    Merci d'avance pour vos conseils.

  2. #2
    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
    Comment faire pour donner l'accès à QObject ?
    Le mettre en public

    Les autres objets ont besoin d'accéder aux méthodes de QObject, c'est un peu le but de QObject

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 74
    Par défaut
    Ok. Bon.
    Du coup obligé de faire une composition quelque part.
    Je te remercie.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Si QTcpServer n'a aucun lien de parenté avec QObject (ca reste à vérifier, mais il semblerait que ce soit le cas ), rien ne t'empêche d'avoir carrément recours à l'héritage (publique) multiple

    Nous ne somme ni en Java ni en C#, après tout: l'héritage multiple, lorsqu'il est envisagé de manière cohérente et intelligente, est tout à fait autorisé

    Tu pourrais donc avoir une classe proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Server : public QObject, // hérite de tout ce qui fait un QObject
                   public QTcpServer // et de tout ce qui fait un QTcpServer
    {
       /* il y a surement du boulot là dedans :D */
    } ;
    La seule chose qu'il vaille mieux éviter, c'est d'avoir à l'héritage multiple de deux classes ayant une même classe de base, car tu te trouverais effectivement face à un héritage en diamant
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Mars 2010
    Messages : 74
    Par défaut
    Merci de ta réponse koala01.

    Je n'avais pas pensé à l'héritage multiple, que je ne maîtrise pas du tout.

    Dans mon cas il aurait fallut faire un héritage mixte composé d'un héritage public pour QObject et protected pour QTcpServer. (Si c'est autorisé).

    Malheureusement...
    Si QTcpServer n'a aucun lien de parenté avec QObject (ca reste à vérifier, mais il semblerait que ce soit le cas )
    QTcpServer hérite de QObject (doc) :
    QTcpServer Class Reference

    The QTcpServer class provides a TCP-based server. More...
    #include <QTcpServer>
    Inherits: QObject.
    Le jour où je maîtriserai l'héritage multiple et qu'un problème similaire arrivera, je penserai à cette solution !
    Je te remercie !

    PS :
    J'en profite pour donner la solution que j'avais adopté, puisque j'y suis.

    Puisque j'étais obligé de réimplémenter la méthode QTcpServer::incomingConnexion(int) pour pouvoir accéder au socketDescriptor du client, j'étais obligé de faire un héritage quelque part.

    Alors j'ai créé une classe TcpServer héritant en public de QTcpServer.
    Je lui ai ajouté un signal sig_incomingConnexion(int socketDescriptor).
    J'ai réimplémenté la méthode void incomingCOnnexion(int socketDescriptor) héritée de QTcpServer.
    Et j'y ai inséré un simple emit sig_incomingConnexion(socketDescriptor).

    Il fallait ensuite protéger l'héritage de QTcpServer.

    J'ai créé une nouvelle classe Server, héritant en public de QObject.
    Je lui ai ajouté
    - le slot protected void incomingConnexion(int socketDescriptor);
    - l'attribut private _tcpServer, objet de la classe TcpServer.
    - un connect() entre TcpServer::sig_incomingConnexion(int) et Server::incomingConnexion(int) dans Server::Server().

    La classe Server peut alors se comporter comporte comme une classe héritant de QTcpServer, alors qu'elle l'encapsule.

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

Discussions similaires

  1. VESA - Mode réel / protégé / EMS-XMS
    Par zdra dans le forum x86 16-bits
    Réponses: 35
    Dernier message: 21/08/2010, 10h39
  2. Problème d'héritage d'une méthode protégée
    Par shenron666 dans le forum C++
    Réponses: 9
    Dernier message: 28/04/2005, 23h17
  3. Réponses: 8
    Dernier message: 04/06/2004, 09h13
  4. Mode protégé pour un OS
    Par Ninkosen dans le forum Programmation d'OS
    Réponses: 2
    Dernier message: 25/11/2002, 13h46
  5. Héritage entre Forms
    Par BarBal dans le forum Composants VCL
    Réponses: 7
    Dernier message: 29/08/2002, 17h44

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