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 :

Gestion d'objet encapsulé et accès aux méthodes.


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut Gestion d'objet encapsulé et accès aux méthodes.
    Bonjour,
    J'ai une question qui va paraître évidente à certain et que je n'arrive pas à résoudre depuis quelques temps.
    Imaginons un cas fictifs, 3 classes, Pays, département, ville
    Un pays contient plusieurs départements.
    Un département contient plusieurs villes.

    Donc la méthode que j'emploie pour que ces trois classes respectent cet ordre, c'est de rajouter un attribut dans pays qui est un tableau de départements, qui est un tableau de départements, et dans départements, qui est un tableau de villes.

    Je cherche un moyen simple pour indiquer que je veux changer le nom de ma ville via la méthode setName() de la classe ville.

    Je pensais pouvoir utiliser quelque chose du genre Pays1.desDepartement[i].desVilles[i].setName('Paris');

    Simplement le debuggeur me dit que les attributs desDepartement[i] et desVilles[i] sont privés. J'ai réussis à feinter avec des variables intermédiaires, mais j'aimerais savoir s'il y a un moyen de faire ça "proprement".

    Merci d'avance

  2. #2
    Futur Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Bonjour,

    je ne sais pas si c'est la manière la plus élégante de faire mais tu pourrais faire une méthode setVilleName(i, j) où i et j sont les numéros de départements et de villes. Cette méthode en appellerai une autre de la classe Departement : setVilleName(j) où j est le numéro de la ville et c'est cette dernière qui appellerai à son tour le setName de la ville j.

  3. #3
    Membre régulier
    Inscrit en
    Août 2002
    Messages
    157
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 157
    Points : 112
    Points
    112
    Par défaut
    de mapart je dirais qu<il tu dois faire des indexeur en surchargeant les operateur []
    dans departement et pays voila
    salut

  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, et bienvenue sur le forum.

    De prime abord, il n'y a déjà aucun intérêt à pouvoir modifier les noms de pays, de départements et de villes ( j'irai même encore plus loin en disant qu'il est tout à fait illogique de permettre de renommer Marseilles en Sochaux ou la Bourgogne en Nord Pas de Calais... Et j'en connais plus d'un qui pousseraient de haut cris si on décidait de renommer la France en Belgique )

    Il y a surement une multitude de choses dont on peut décider d'accepter la modification (allant du nom du chef d'état à la population, en passant, pourquoi pas, par la superficie), mais les noms sont quelque chose de finalement fort stables en générale (non, je n'oublie pas que le Congo est devenu Zaïre avant de redevenir Congo, ni que certaines villes ont été renommées )

    Il me semble donc déjà cohérent de ne pas permettre de faire à tes objets ce qui n'a - pour ainsi dire - aucune chance d'être accepté

    Par contre, il semble cohérent de faire de manière à ce que le nom du pays, du département ou de la ville soit pris en compte dés la construction de l'objet (cela s'appelle la notion de RAII)

    Ensuite, il faut avouer que l'idée d'utiliser un indice numérique pour accéder à un pays, un département ou une ville me laisse pour le moins perplexe...

    Je suis d'accord avec le fait qu'en France, vous numérotez vos départements, (voire les arrondissements de Paris), mais vous ne numérotez pas vos villes...

    Le meilleur moyen d'identifier à coup sur et de manière unique un pays, un département ou une vile, reste quand même toujours de se baser sur... le nom du dit pays, département ou ville

    Enfin, il faut avouer que, une fois tous les départements et toutes les villes créées, ce que tu fera le plus souvent, c'est... rechercher un département ou une ville

    Tout cela pour dire que, bien que je comprenne que la première idée qui te soit venue à l'esprit est de créer un tableau de villes dans le département et un tableau de départements dans le pays, il serait vraiment intéressant de repenser au choix du conteneur pour ces collections de villes et de départements (et il en va de même si tu veux aller plus haut avec les continents qui contiennent des pays et le monde qui contient des continents )

    En effet, l'idéal me semble fort de choisir un conteneur qui te permettra facilement de retrouver un élément particulier de la collection, sur base de ce qui caractérise le mieux cet élément particulier: son nom.

    Tu trouvera dans la faq une entrée qui te permettra de trouver le conteneur le mieux adapté à tes besoins, mais, l'un dans l'autre, je me dis que la map est susceptible de te convenir

    Tu restera évidemment libre de surcharger l'opérateur [], mais n'aurais tu pas tout aussi facile d'écrire un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Monde.getContinent("Europe").getPays("France").getDepartement("Centre")
    qui aurait au moins l'énorme avantage de préciser clairement ce que tu demande à récupérer à chaque fois (et donc de faciliter énormément la compréhension du code)
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Bonjour et merci de vos réponses.

    Le cas des pays, villes et départements était un exemple fictif pour illustrer mon problème, et ce n'était pas le meilleur.
    Je vais prendre clairement mon cas en exemple.
    J'ai une classe Jeu, Ligne, et Bloc.
    Un Jeu contient 8 Lignes, une Ligne contient 8 Blocs.
    La classe Jeu contient l'attribut desLignes[8]
    La classe Ligne contient l'attribut desBlocs[8]

    Je voudrais par exemple modifier la valeur du 3ème bloc de la 5ème ligne via la methode setValeur(int uneValeur).

    J'imaginais qu'on puisse faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Jeu1.getDesLignes(5).getDesBlocs(3).setValeur(0);
    Mais ce n'est pas faisable.
    Quel est le moyen d'appliquer cette méthode à un Bloc précis à partir du numéro de la ligne et du bloc ?

  6. #6
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par Ragnarok666 Voir le message
    J'imaginais qu'on puisse faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Jeu1.getDesLignes(5).getDesBlocs(3).setValeur(0);
    Mais ce n'est pas faisable.
    C'est correct et tout à fait faisable.

    Exemple pour getDesLignes()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    const Ligne& getDesLignes(int num) const
    {
        return desLignes[i];
    }
     
    Ligne& getDesLignes(int num)
    {
        return desLignes[i];
    }
    Une version const lorsque tu veux seulement accéder à la donnée sans la modifier, et une version non const lorsqu'il y a une modification comme dans ton cas

    Faut retourner une référence pour ne pas passer une copie, donc pour que la modification soit prise en compte (pour la version non const bien sur). Pour la version const, celà évite une copie inutile de l'objet.

  7. #7
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Points : 833
    Points
    833
    Par défaut
    Citation Envoyé par Ragnarok666 Voir le message
    J'imaginais qu'on puisse faire quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Jeu1.getDesLignes(5).getDesBlocs(3).setValeur(0);
    Mais ce n'est pas faisable.
    Pourquoi ? Quelle est l'erreur ?

    Si tu dois faire souvent cette opération le plus simple (ou le moins pire) est peut être comme expliquait kennyyy:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Jeu1.setBlocValueAt(line, row,value);
    qui est sans doute plus lisible.

    A toi de faire les getters et setter qui vont bien pour en arriver là.
    Linux > *

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 11
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    Pourquoi ? Quelle est l'erreur ?
    Il n'y a pas d'erreur de compilation cependant ma valeur n'est pas changée, pour de l'affichage d'attribut ça fonctionne, mais pas pour de la modification.
    Rajouter un attribut numLigne dans bloc... pourquoi pas mais je pensais qu'il y avait moyen de faire plus propre.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/04/2014, 20h09
  2. [WD17] Tableau d'objet accès aux méthodes
    Par thierrybatlle dans le forum WinDev
    Réponses: 8
    Dernier message: 28/09/2012, 15h54
  3. Accès aux méthodes d'un objet dans un vector.
    Par Huruu dans le forum Débuter
    Réponses: 4
    Dernier message: 09/02/2010, 16h23
  4. Réponses: 5
    Dernier message: 22/04/2005, 11h38
  5. [TOMCAT] JSP problème d'accès aux méthodes d'une classes
    Par gunnm dans le forum Tomcat et TomEE
    Réponses: 3
    Dernier message: 22/05/2004, 14h02

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