Partage
  • Partager sur Facebook
  • Partager sur Twitter

restriction d'accès

    16 septembre 2007 à 10:33:34

    Bonjour !
    Laissez-moi vous expliquer mon problème : j'aimerai restreindre l'accès à des méthodes de classes, sous certaines conditions. Par exemple (par ce que là, j'avoue que c'est pas très clair :lol: ) :
    J'ai une classe A, déclarée dans A.h et implémentée dans A.cpp :
    1. class A
    2. {
    3.     void methode1();
    4.     void methode2();
    5. };

    et une classe B, déclarée dans B.h et implémentée dans B.cpp :
    1. class B
    2. {
    3.     void methode3();
    4.     void methode4();
    5. };

    A partir de là, j'aurai aimé savoir s'il est possible de remplir ces trois conditions en même temps :
    • toutes les méthodes de B sont accessibles à partir de A
    • toutes les méthodes de A sont accessibles à partir de B
    • et surtout, seules certaines méthodes de A et B sont accessibles dans le main du programme, disons methode1() et methode3() par exemple.

    Voilà, merci :)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      16 septembre 2007 à 10:37:28

      Je dirais que oui. Mais comment j'en sais rien. Mais peut-être via "friend" (que je ne sais pas utiliser) combiné à public et private.

      Mais je pense que tu as mal réfléchis au problème pour avoir besoin de faire ça.

      Revois ton algo, ainsi que la hiérarchie de tes classes.
      • Partager sur Facebook
      • Partager sur Twitter
        16 septembre 2007 à 11:45:18

        non non, déclarer des classes friends ne résoudra pas mon problème car je veux qu'une classe puisse accéder à toutes les méthodes d'une autre classe mais pas à ses membres !
        Pour ce qui est de mon programme, c'est en fait une petite librairie que j'essaie de créer donc il faut que chaque module de la librairie puisse comuniquer avec le reste de la librairie mais l'utilisateur, quand à lui, n'a pas à pouvoir utiliser toutes les méthodes de la librairie
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 septembre 2007 à 11:48:02

          Quand je parlais de friend, je ne parlais pas de classe mais de méthode.
          • Partager sur Facebook
          • Partager sur Twitter
            16 septembre 2007 à 11:51:35

            c'est pareil je crois. Si je déclare la méthode A::methode1() comme friend à l'intérieur de la classe B, ça voudra dire que la méthode A::methode1() aura accès aux membres privés de la classe B (enfin, à tout ce qui est private ou protected).
            corrigez-moi si je me trompe mais il me semble que c'est ainsi que fonctionne "friend"...
            • Partager sur Facebook
            • Partager sur Twitter
              16 septembre 2007 à 12:16:46

              il me semble que friend peut avoir accès a public: et protected: mais pas a private:
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                16 septembre 2007 à 12:17:37

                A oui, peut-être que tu as raison. Je n'ai jamais utilisé friend. Essaye pour voir.
                • Partager sur Facebook
                • Partager sur Twitter
                  16 septembre 2007 à 12:30:24

                  1. class CFlux
                  2. {
                  3.         public:
                  4.                 friend std::ostream &operator<<(std::ostream &Out, CFlux &Flux);
                  5.         protected:
                  6.                 void Out(std::ostream &Out);
                  7.         private:
                  8.                 long i;
                  9. };
                  10. //ceci passe a la compilation
                  11. std::ostream &operator<<(std::ostream &Out, CFlux &Flux)
                  12. {
                  13.         Out << Flux.i;
                  14.         return Out;
                  15. }
                  16. //ceci passe a la compilation
                  17. std::ostream &operator<<(std::ostream &Out, CFlux &Flux)
                  18. {
                  19.         Flux.Out(Out);
                  20.         return Out;
                  21. }
                  22. void CFlux::Out(std::ostream &Out)
                  23. {
                  24.         Out << i;
                  25. }
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    16 septembre 2007 à 12:38:11

                    Si friend est déclaré au niveau de la classe , il donne accès a tout , même au private.

                    Par contre , on peut ne déclarer que certaine méthodes friend d'une autre classe.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 septembre 2007 à 13:27:12

                      Ce qui a été dit au-dessus, n'est pas tout à fait correct.

                      Ce que tu demandes est tout à fait possible.

                      1) Tu mets les méthodes ququel tu veux accéder depuis le main en "public" et les autres en private ou protected.
                      2) Tu déclares la classe A friend de B et B friend de A.

                      C'est tout et ça suffit.

                      Mais est tu sûr d'être obligé de faire ça comme ça ? L'utilisation trop fréquente de friend montre souvent une mauvaise conception.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                        16 septembre 2007 à 13:50:00

                        En réalité, je ne suis pas obigé de le faire mais c'est juste pour ajouter une protection supplémentaire, pour que l'utilisateur n'appelle pas des fonctions qu'il n'a pas à appeller
                        Je vais vous donner un exemple :
                        J'ai une classe abstaite de base (EW_Objet) qui est parent de tout un tas d'objets graphiques. Cette classe contient des méthodes public qui doivent être accessibles par l'utilisateur (comme resize, move, setPosition, etc...). Bien, j'ai aussi une autre classe EW_Conteneur (dérivée de EW_Objet) qui gère une liste de EW_Objet. Mettons par exemple que j'appelle la methode move de EW_Conteneur : j'aurai besoin d'appeller les fonctions ajouter_surface() de chaque EW_Objet pour réactualiser l'affichage. Mais tout ça, c'est de la gestion en interne, je n'ai pas envie que l'utilisateur puisse appeller directement la méthode EW_Objet::ajouter_surface().
                        Après, je pourais tout aussi bien spécifier à l'utilisateur : "n'utilisez pas telles ou telles méthodes !" mais bon....
                        • Partager sur Facebook
                        • Partager sur Twitter

                        restriction d'accès

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown