Tema: clases
Ver Mensaje Individual
  #5 (permalink)  
Antiguo 18/05/2014, 10:21
dehm
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 14 años, 5 meses
Puntos: 10
Respuesta: clases

Bueno, creo que el error es si consideramos el acceso a los miembros de la clase desde dentro de la clase (sus funciones) o que las instancias puedan acceder a dichos miembros.

Cuando hablamos de instancias de clase, los objetos, ciertamente no pueden ni deben acceder a los miembros de la clase. Para ello los declaramos dentro de la zona private o protected.

En este ejemplo:
Código C++:
Ver original
  1. class claseA
  2.     {
  3.         int a;
  4.  
  5.         public:
  6.         claseA():a(10){}
  7.  
  8.         int damea()
  9.         {
  10.             return a;
  11.         }
  12.        
  13.     };

Como ves, las funciones miembro, pertenecientes a la propia clase claseA, pueden acceder a a.
Pero no podría hacer esto: (desde main instanciar un objeto de la clase e intentar acceder de forma directa a a
Código C++:
Ver original
  1. ClaseA objeto1;
  2. cout<<objeto1.a<<endl;
El compilador se quejará de que a es privado.
Y como dices, he de acceder a través de una función declarada en la parte pública, la cual tiene acceso a a porque forma parte de la propia clase.

Entonces, para qué sirve el modificador friend?

Imagina que creamos otra clase:
Código C++:
Ver original
  1. class claseB
  2.     {
  3.         claseA objeto;
  4.  
  5.         public:
  6.         claseB()
  7.         {
  8.             objeto.a=5;
  9.         }
  10.  
  11.         int damea()
  12.         {
  13.             return objeto.a;
  14.         }
  15.     };

Tanto el constructor como la función damea() de la clase claseB intentan acceder a a, que es el miembro del objeto "objeto" del tipo ClaseA.
Pero nuevamente el compilador se quejará de que se quiere acceder a una parte privada. Como el constructor y la función damea() de la clase claseB no pertenecen a la clase claseA, nuevamente son funciones ajenas a dicho miembro.

Para evitar esto es cuando usamos el modificador friend:
Código C++:
Ver original
  1. #include <iostream>
  2.     using namespace std;
  3.  
  4.     class claseA
  5.     {
  6.         int a;
  7.  
  8.         public:
  9.         claseA():a(10){}
  10.  
  11.         int damea()
  12.         {
  13.             return a;
  14.         }
  15.         friend class claseB;
  16.     };
  17.  
  18.     class claseB
  19.     {
  20.         claseA objeto;
  21.  
  22.         public:
  23.         claseB()
  24.         {
  25.             objeto.a=5; //acceso directo a "a"
  26.         }
  27.  
  28.         int damea()
  29.         {
  30.             return objeto.a; //acceso directo a "a"
  31.         }
  32.     };
  33.  
  34.    
  35.  
  36.     int main () {
  37.  
  38.         claseA elemento1;
  39.         cout<<elemento1.damea()<<endl;
  40.  
  41.         claseB elemento2;
  42.         cout<<elemento2.damea()<<endl;
  43.  
  44.     }

Ahora puedo acceder a a de forma directa, sin hacer uso de una función que retorne el valor. Obviamente, no tiene sentido usar a si no es un componente de un objeto de la clase, salvo que fuera una variable estática. Por eso tiene sentido cuando en la clase claseB tengo un objeto de la clase claseA, y quiero acceder de forma DIRECTA a sus miembros.

Espero que esto ayude a ver el uso de friend un poco mejor.