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 :

Utiliser un objet d'une classe dans une autre


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut Utiliser un objet d'une classe dans une autre
    Salut à tous, enfaîte j'ai un soucis avec mon code Qt : Je possède 2 classes (disons a et b), j'aimerai créer une List de a dans la classe b, donc dans le "private" de ma classe b, je définis cela : QList<a> List_a; sauf qu'il me renvoie que "a" n'est pas déclaré, donc je vois pas trop comment faire...

    Merci de votre aide

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    Comment as tu écris tes deux classes? (je ne te donne pas la réponse de suite afin que tu puisses comprendre d'où vient ce problème).

  3. #3
    Invité
    Invité(e)
    Par défaut
    Alors j'ai résolu (contourné) le problème en utilisant un QList, mais je sais pas trop si c'est cool :/ j'aimerai savoir pourquoi cela ne marche pas :/

    la classe A (JSon) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Parametre;
     
    class JSon
    {
    public:
        JSon();
        QList<Parametre> Param_Vect;
    private:
        };
    La classe B (parametre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class Parametre
    {
    public:
        Parametre(QJsonObject object);
        QString m_id;
        QString m_nom_D;
        QString m_nom_E;
        QString m_nom_F;
        QString m_desc_D;
        QString m_desc_E;
        QString m_desc_F;
        QJsonArray m_choix_D;
        QJsonArray m_choix_E;
        QJsonArray m_choix_F;
        QJsonArray m_code_choix;
     
    private:
     
     
    };

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ici, Parametre est déclaré mais pas défini (c'est donc un type incomplet).
    Mais si tu rajoutes un #include "Parametre.h" avant la définition de la classe JSon...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Ok enfaite c'est bon ca marche avec le vecteur c'est cool
    J'avais déjà mis les includes dans le code (mais pas dans le post) donc je pense que ce n'etait pas ca, c'etait un problème d'index car j'ai indiqué la taille du QVector et ca a marché
    Enfin bref merci

    Edit : J'ai une autre question dans la même veine : j'ai une instance de ma classe JSon nommé "test" dans mon main, maintenant j'aimerai récuperer un attribut (public) de cette instance pour l'utiliser dans une 3eme classe, sauf que je m'y parviens pas, Qt ne me le propose pas en autocomplétion (donc j'en déduis que c'est faux... Mais pourquoi ? :/
    Dernière modification par Invité ; 27/05/2016 à 15h41.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    - je n'ai rien compris au problème initiale
    - ne fais pas trop confiance à l'auto-complétion qui peut facilement se planter/perdre selon le projet et l'IDE
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 470
    Points : 6 107
    Points
    6 107
    Par défaut
    Bonjour.

    Citation Envoyé par Agudolive Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    class Parametre
    {
    public:
        Parametre(QJsonObject object);
        QString m_id;
        QString m_nom_D;
        QString m_nom_E;
        QString m_nom_F;
        QString m_desc_D;
        QString m_desc_E;
        QString m_desc_F;
        QJsonArray m_choix_D;
        QJsonArray m_choix_E;
        QJsonArray m_choix_F;
        QJsonArray m_code_choix;
     
    private:
     
     
    };
    Mettre des variables membres publiques est une mauvaise pratique.
    Il est préférable d'encapsuler les données et de fournir à l'utilisateur des accesseurs (getters) et des mutateurs (setters).

    Exemples de motivations :
    • Si un jour tu veux fusionner m_nom_D, m_desc_D et m_choix_D en un seul objet (pareil pour E et F), si tu as fait de l'encapsulation, tu n'auras pas besoin de changer le code des utilisateurs de ta classe Parametre.
    • Si un jour ton programme est lent à compiler et que beaucoup de modules incluent Parametre.h, si tu as fait de l'encapsulation, tu pourras gratter du temps de compilation en utilisant la technique du pointeur opaque. Ainsi, les modules qui incluront Parametre.h (directement ou indirectement) ne seront plus forcément obligés d'inclure <QJsonArray>.
      Par contre, si tu n'as pas fait d'encapsulation, tu ne pourras pas car ce serait trop long et pénible de changer le code dans chacun des modules qui incluent Parametre.h.


    Remarque : Si tes accesseurs et des mutateurs sont en ligne, il n'y aura pas de perte de performance par rapport à l'absence d'encapsulation.

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Pyramidev Voir le message
    Bonjour.

    Mettre des variables membres publiques est une mauvaise pratique.
    Il est préférable d'encapsuler les données et de fournir à l'utilisateur des accesseurs (getters) et des mutateurs (setters).
    Oh, par pitié, non!!!!

    Avoir des accesseurs, cela peut se comprendre si (et SEULEMENT SI) on est en droit d'estimer que l'obtention de la donnée en question correspond bel et bien à un service qui doit être rendu par notre classe.

    Par contre, la présence des mutateurs est -- non seulement -- en contradiction flagrante avec la loi de Déméter(*), mais elle est aussi le symptôme fort que l'on réfléchit beaucoup plus à notre classe en terme des données qu'elle contient qu'en termes des services qu'elle doit rendre.

    Si, d'une manière ou d'une autre, on en vient à fournir un accesseur ET un mutateur sur un donnée quelconque de notre classe, on en revient SYSTEMATIQUEMENT au même problème que si la donnée avait été placée dans l'accessibilité publique : c'est à l'utilisateur de notre classe de veiller à respecter TOUTES LES REGLES (pré conditions / post conditions / invariants) imposées par la classe, alors que cela aurait du être le travail ... de la classe, justement.

    Alors, pour en revenir au problème d'origine, peut-être que la notion de paramètre ne doit être effectivement envisagée que pour ce qu'elle est : un agglomérat de données de types divers et variés, quitte à ce que ce soit la classe / les fonctions qui le manipule(nt) qui s'occupe de faire respecter les règles que l'on souhaite imposer sur cet agglomérat.
    (*) En fait, la loi de Déméter s'énonce comme suit
    Citation Envoyé par loi de Déméter
    Si un objet de type A utilise en interne un objet de type B, l'utilisateur de l'objet de type A n'a pas à devoir connaitre le type B pour manipuler le type A.
    Mais, je commence à préférer un énoncé plus personnel qui serait proche de
    Si un objet a de type A utilise en interne une donnée b de type B, l'utilisateur de l'objet a n'a pas à connaitre la valeur de a.b pour pouvoir manipuler son a
    car le problème n'est pas forcément de permettre (ou non) à l'utilisateur de récupérer des données (plus ou moins) complexes sous une forme proche de celle qui est utilisée pour les représenter, mais bien de forcer l'utilisateur à connaitre exactement la valeur de ces données afin de déterminer par lui-même, au risque d'oublier une règle ou une obligation quelconque, une "nouvelle valeur" pour cette donnée.

    Bien sur, cela s'écarte de "la lettre" de la loi de Déméter, mais, AMHA, cela se rapproche bien d'avantage de son sens
    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

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    À noter que les Data Transfer Objects (DTO) (Objets de Transport de Données) sont exempts des règles d'encapsulation, parce qu'exposer les données est le seul service qu'ils rendent.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Poo : utiliser une classe dans une classe ?
    Par devoluti0n dans le forum Langage
    Réponses: 2
    Dernier message: 28/10/2010, 17h03
  2. utilisation d'une variable d'une class dans une autre class
    Par the watcher dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2010, 14h01
  3. Eval d'une propriété d'une classe dans une classe
    Par bizet dans le forum ASP.NET
    Réponses: 4
    Dernier message: 28/10/2008, 09h43
  4. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  5. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

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