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 :

Acceder à une variable membre


Sujet :

C++

  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut Acceder à une variable membre
    Bonjour,

    J'ai un petit soucis :

    J'ai une classe, qui contient un vecteur d'objets, qui eux-même contiennent un vecteur d'objets...

    Les objets présents à chaque niveau sont bien spécifiques à ce niveau :

    La classe ville contient :
    - un vecteur de pointeurs vers des immeubles

    La classe immeuble contient :
    - un vecteur de pointeurs vers des appartements
    - un pointeur vers la ville qui le contient

    La classe appartement contient :
    - un vecteur de pointeurs vers des locataires
    - un pointeur vers l'immeuble qui le contient

    La classe locataire contient :
    - un pointeur vers l'appartement qui le contient

    Jusque là, ça me parait très classique.

    Maintenant, un locataire souhaiterais savoir dans quelle ville il habite.

    Existe-il une autre façon de concevoir les choses qui permettrait d'éviter de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ville = locataire->appartement->immeuble->ville;
    Parceque bon, rien qu'à l'ecrire comme ça, ça me parait lourdingue...

    C'est sûr, je pourrais copier dans chaque objet les pointeurs vers tous les objets qui le contiennent :

    La classe locataire contient :
    - un pointeur vers l'appartement qui le contient
    - un pointeur vers l'immeuble qui le contient
    - un pointeur vers la ville qui le contient

    Mais ça fait beaucoup de données à mettre à jour en cas de déménagement...

    Merci pour vos idées !

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Si le probleme est l'ecriture lourde, dans locataire tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Ville* GetVille()
    {
      return GetImmeuble()->GetVille();
    }
     
    Immeuble* GetImmeuble()
    {
      return GetAppartement()->GetImmeuble();
    }
     
    Appartement* GetAppartement()
    {
      return m_ptrAppart;
    }
    Et tu fais pareil dans les classe Appartement et Immeuble.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Mouais, en fait, c'est déjà ce que je fait.

    Ce que je voulais savoir surtout, c'est si il existe une solution "architecture" à un probleme de ce type.

    Par exemple, en créant une classe supplementaire "lien" qui lie deux objets entre eux.

    Mais ça ne parait pas du tout une bonne idée, donc bon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ville = locataire->appartement->immeuble->ville;
    Ecrit d'une façon ou d'une autre, est-ce la seule/meilleure solution ?

    (sans parler de pointeurs qui risquent d'être nuls, on verifie avant dans les fonctions getTruc())

  4. #4
    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,

    Tu pourrais, éventuellement, te baser sur un patern du genre Observateur...

    La question à 0.20€ étant de savoir si cela en vaut réellement la peine

    (on *pourrait* estimer que cela faciliterait sans doute la gestion d'un démnagement )

    Sinon, de fait, tu pourrais envisager une fonction GetTown() pour Imeuble, qui serait redéfinie sous la forme de m_immeuble->GetTown() pour Appartement et sou celle de m_appart->GetTown() pour Locataire...

    Mais, au final:
    • L'écriture reste la même
    • cela ne simplifique "que" l'accès à l'info de l'extérieur
    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 éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Pour savoir si cela vaut vraiment la peine, ben l'exemple que j'ai pris n'est qu'un... exemple.

    En réalité, je dois gérer un nombre croissant de données, car de nouveaux objets viendront s'ajouter au fur et à mesure.

    Donc avant de coder une usine à gaz, je prefere bien reflechir.

    Merci pour les idées !

  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
    A priori, la structure minimale pour stocker toutes tes données c'est (du plus grand au plus petit) : une ville contient des immeubles qui contiennent des appartements qui contiennent des locataires.

    Ensuite, libre à toi de rajouter des données dans les classes ville, immeuble, appartement et locataire pour accéder plus directement à des informations.

    Par exemple tu peux rajouter dans la classe locataire un pointeur sur ville si c'est une information dont t'a souvent besoin.

    C'est à toi de trouver le bon compromis entre facilité (et rapidité) d'accès aux information et facilité de mise à jour.

  7. #7
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Par exemple tu peux rajouter dans la classe locataire un pointeur sur ville si c'est une information dont t'a souvent besoin.
    Bien sûr, mais cela fait une donnée en plus à gérer en cas de changement.

    Ce que j'aimerais pouvoir faire de la façon la plus clean possible :

    - depuis un objet, acceder à n'importe quel objet d'un niveau supérieur, avec son type (acceder à un immeuble depuis un locataire avec un pointeur sur un immeuble, pas sur une classe mère de tous les objets, pour éviter de downcaster le-dit pointeur)

    - lors d'un changement de données (un locataire change d'appartement, un appartement change d'immeuble, un locataire change d'immeuble en gardant son appartement..) être assuré de la mise à jour de tous les pointeurs qui s'y rapportent.

    Evidemment, je ne traite pas réélement des locataires, sinon ils n'auraient pas le choix entre prendre leur appartement sous le bras ou pas

    Mais l'idée principale est là : des objets contenant des listes d'objets, et chaque objet ne peut être contenu que par un seul type de conteneur (un immeuble ne peut pas contenir des locataires, il ne contient que des appartements)

  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
    Citation Envoyé par buzzkaido Voir le message
    Pour savoir si cela vaut vraiment la peine, ben l'exemple que j'ai pris n'est qu'un... exemple.

    En réalité, je dois gérer un nombre croissant de données, car de nouveaux objets viendront s'ajouter au fur et à mesure.

    Donc avant de coder une usine à gaz, je prefere bien reflechir.

    Merci pour les idées !
    Bien sûr, mais, le but de la présence de cette question est... simplement de t'inciter à te la poser
    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
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Points : 734
    Points
    734
    Par défaut
    Ben les solutions que j'ai trouvées (dupliquer les données ou acceder via les pointeurs de tous les niveaux successifs au dessus) me font penser que ça ne vaut pas la peine de se casser plus la tête que ça...

    Mais comme je n'ai pas toutes les idées possibles dans ma tête, ben , je demande aux autres... des fois qu'il y ait une autre façon de voir les choses bien plus efficace...

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/06/2007, 13h49
  2. Réponses: 6
    Dernier message: 02/06/2007, 01h07
  3. Réponses: 7
    Dernier message: 28/10/2006, 19h07
  4. comment récupérer une variable membre?
    Par marute dans le forum MFC
    Réponses: 4
    Dernier message: 13/04/2006, 16h11
  5. Réponses: 9
    Dernier message: 20/03/2006, 16h51

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