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 :

méthode friend


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut méthode friend
    Bonjours, je viens d'aller voir sur la FAQ mais je ne trouve pas ce que je veux, je ne comprend pas la réel utiliisation de déclarer quelque chose friend .

    Quelqu'un pourrais t-il me l'expliquer ? merci

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    quand tu déclares une fonction ou une classe comme friend d'une classe, cela signifie que tu l'autorise à accèder aux données et méthodes membres de la classe spécifiées comme protected et private, je suis surpris que tu n'ais pas trouvé la réponse dans un tuto ni dans la faq

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 107
    Points : 48
    Points
    48
    Par défaut
    oui mais si on a que une classe, avec dedans une méthode public déclarée friends ceci sert a quoi exemple

    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 point {
            public :
                /* Constructeurs */
                point();
                point(const &);
                point(float);
                point(float,float);
                ~point();
     
                /* Méthodes  d'accès */
                void CoordonnePoint(float);
                void CoordonnePoint(float,float);
                void CoordonnePoint(const point &);
                friend ostream& operator<< (const &);
                friend point operator+(const &);
     
            private :
                float *pX;
                float *py;
        }
    pourquoi ne pas mettre

    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 point {
            public :
                /* Constructeurs */
                point();
                point(const &);
                point(float);
                point(float,float);
                ~point();
     
                /* Méthodes  d'accès */
                void CoordonnePoint(float);
                void CoordonnePoint(float,float);
                void CoordonnePoint(const point &);
                ostream& operator<< (const &);
                point operator+(const &);
     
            private :
                float *pX;
                float *py;
        }

  4. #4
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    L'opérateur d'injection doit obligatoirement être déclaré friend car s'il fait parti de la classe on devrait faire ça pour afficher :

  5. #5
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Salut,
    pour ce problème je pense qu'il est encore mieux de faire ceci :
    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
     
    class point {        
      public :            
        /* Constructeurs */            
          ...
        /* Méthodes  d'accès */            
        void CoordonnePoint(float);
        void CoordonnePoint(float,float);
        void CoordonnePoint(const point &);            
        point operator+(const &);        
      private :            
        float *pX;
        float *py;    
    } 
    ostream& operator<< (ostream & o, const point & );
    On n'a pas besoin "d'encombrer" la classe point avec une méthode qui peut être extérieure à la classe.

    J'ai l'impression que les fonctions friends ne servent pas à grand chose, si ce n'est qu'a passer au travers de l'encapsulation ; c'est pourquoi je ne les emploie pas. (J'aimerais avoir l'avis de quelques personnes)

    Citation Envoyé par Swoög
    quand tu déclares une fonction ou une classe comme friend d'une classe, cela signifie que tu l'autorise à accèder aux données et méthodes membres de la classe spécifiées comme protected et private, je suis surpris que tu n'ais pas trouvé la réponse dans un tuto ni dans la faq.
    Je pense qu'il voudrait savoir à quoi elles servent réelement, ie où on doit les utiliser et pourquoi les utiliser.

    b Oo

  6. #6
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Avril 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2006
    Messages : 237
    Points : 283
    Points
    283
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ostream& operator<< (ostream & o, const point & );
    Si elle n'est pas friend on ne peut utiliser les données membres.
    On est donc obligé de faire des accesseurs (c'est vrai que normalement ils y sont...) On peut aussi utiliser les fonctions membres privées !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Citation Envoyé par b Oo
    Salut,
    pour ce problème je pense qu'il est encore mieux de faire ceci :
    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
     
    class point {        
      public :            
        /* Constructeurs */            
          ...
        /* Méthodes  d'accès */            
        void CoordonnePoint(float);
        void CoordonnePoint(float,float);
        void CoordonnePoint(const point &);            
        point operator+(const &);        
      private :            
        float *pX;
        float *py;    
    } 
    ostream& operator<< (ostream & o, const point & );
    On n'a pas besoin "d'encombrer" la classe point avec une méthode qui peut être extérieure à la classe.

    J'ai l'impression que les fonctions friends ne servent pas à grand chose, si ce n'est qu'a passer au travers de l'encapsulation ; c'est pourquoi je ne les emploie pas. (J'aimerais avoir l'avis de quelques personnes)

    Je pense qu'il voudrait savoir à quoi elles servent réelement, ie où on doit les utiliser et pourquoi les utiliser.

    b Oo
    Elles brisent en effet l'encapsulation donc plusieurs solutions :
    - tu recodes les classes dont certaines méthodes private auraient du être protected (c'est long) et tu hérites de ces classes pour en faire ce dont tu as besoin.
    - tu passes par une fonction externe déclarée dans aucune classe comme dans ton cas et on n'est plus vraiment dans de l'objet à proprement parlé.
    - tu utilises les classes amies qui semble être un bon compromis.

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ca a déjà été discuté : les fonctions amies ne brisent pas l'encapsulation, bien au contraire.

    http://c.developpez.com/faq/cpp/?pag..._encapsulation

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/04/2004, 16h51
  2. Gros Problème avec DirectShow et la méthode RELEASE
    Par Olivier Delmotte dans le forum DirectX
    Réponses: 3
    Dernier message: 10/03/2003, 18h10
  3. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26
  5. Cryptage en C selon la méthode de césat
    Par shenron dans le forum C
    Réponses: 2
    Dernier message: 31/05/2002, 08h22

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