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

SL & STL C++ Discussion :

Syntaxe : envoyer un pointeur vers un conteneur membre d'une classe


Sujet :

SL & STL C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Syntaxe : envoyer un pointeur vers un conteneur membre d'une classe
    Hello,

    J'ai une fonction membre qui a un map parmi ses données membre.
    Je voudrais qu'une fonction publique get...() renvoie un pointeur vers ce map.

    Apparemment, déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class listBuilder
    {
    public:
        map<int,std::string>* getList() const;
    private:
        map<int,std::string> mList;
    };
    ça ne le fait pas.

    Le but de la classe est simplement de de construire un map, et que l'appelant puisse exploiter ce map.
    Par ailleurs, si le "client" doit à l'avenir avoir la possibilité de réarranger ce map, cela a-t-il encore un sens de l'encapsuler ?

    Merci !

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Pourquoi ne pas fournir une reference constante a la map plutot, et ensuite laisser l'utilisateur voir ce qu'il en fait? Si il a besoin de la modifier il en fera une copie, ton builder aura ainsi fait son office de juste builder la map.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Quel est l'avantage d'une référence const par rapport à une fonction const ?

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    ça n'a rien a voir : ta fonction const garanti juste que les membres de la classe non-mutable ne seront pas modifiés. Tandis que je te parles du type de retour, référence constante, qui donc correspond a une référence vers la map (autrement dit un alias) mais qui ne sera pas modifiable (parceque seul les methodes const de la map seront utilisables- utiliser les autres provoquera une erreur a la compilation).

    De cette manière tu fournis ta map générée en "lecture seule" et si l'utilisateur veut la modifier, il en fera une copie.


    Cela dit, dans ce cas autant remplacer cette classe entière par une fonction non? Qui prendrait en paramettre une reference (non const) vers une map (qui serait donc gérée par l'utilisateur) et qui la remplirais directement.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par Klaim Voir le message
    ça n'a rien a voir : ta fonction const garanti juste que les membres de la classe non-mutable ne seront pas modifiés.
    Parfait : je ne veux pas que mon map soit modifié par le client (pour l'instant).

    Citation Envoyé par Klaim Voir le message
    Tandis que je te parles du type de retour, référence constante, qui donc correspond a une référence vers la map (autrement dit un alias) mais qui ne sera pas modifiable

    De cette manière tu fournis ta map générée en "lecture seule" et si l'utilisateur veut la modifier, il en fera une copie.
    Donc, l'utilisateur ne peut pas modifier le map, comme dans le cas précédent.

    Citation Envoyé par Klaim Voir le message
    Cela dit, dans ce cas autant remplacer cette classe entière par une fonction non ? Qui prendrait en paramètre une reference (non const) vers une map (qui serait donc gérée par l'utilisateur) et qui la remplirais directement.
    Non, car je veux faire un héritage, par la suite. La construction de la liste (que je mettrai dans le constructeur) sera de plus en plus complexe.

  6. #6
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Salut,

    Pourquoi ne pas tout faire directement dans la classe, plutôt que de renvoyer un pointeur (ou référence) sur le membre? Tu pourras alors créer tes fonctions de manipulation directement dans cette classe, plutôt que chez le client (donc pas de code redondant):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class MyBuilder
    {
    public:
        Consultation1() const;
        Consultation2() const;
        Consultation3() const;
        Consultation4() const;
        ....
    private:
        map<int,std::string> mList;
    };
    Ensuite, tu rajoutes dans tes éventuelles classe filles tes méthodes de plus en plus complexes.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ben les manipulations, ce sont celles de la STL, alors pas de soucis sur la redondance.

    J'aimerais en tout cas bien connaître la syntaxe à utiliser pour renvoyer un pointeur (cf question initiale).

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Donc, l'utilisateur ne peut pas modifier le map, comme dans le cas précédent.
    Dans le cas précédent tu fournis un simple pointeur, donc l'utilisateur peut tout a fait manipuler ta map comme il l'entends, ou du moins les données qui lui correspondent.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Effectivement.

    Et avec les références, quelle serait donc la syntaxe ?

  10. #10
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Ca m'étone que ton compilateur accepte de renvoyer un pointeur non const depuis une méthode const, car g++ refuse.

    Sinon la syntaxte serrai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const map<int,std::string>& getList() const;

  11. #11
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Ca m'étone que ton compilateur accepte de renvoyer un pointeur non const depuis une méthode const, car g++ refuse.
    Textuellement, ça se comprend car la fonction ne modifie pas la classe, elle ne fait que renvoyer un pointeur. Mais rien n'empêche de modifier le pointeur par la suite alors qu'il a été obtenu par une méthode const.
    G++ semble être plus malin et avoir pallié à ça .

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/04/2011, 17h19
  2. Utilisation d'un conteneur membre d'une autre classe
    Par oodini dans le forum SL & STL
    Réponses: 2
    Dernier message: 22/10/2008, 18h45
  3. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  4. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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