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 originalclass claseA
{
int a;
public:
claseA():a(10){}
int damea()
{
return a;
}
};
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 originalClaseA objeto1;
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 originalclass claseB
{
claseA objeto;
public:
claseB()
{
objeto.a=5;
}
int damea()
{
return objeto.a;
}
};
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#include <iostream>
using namespace std;
class claseA
{
int a;
public:
claseA():a(10){}
int damea()
{
return a;
}
friend class claseB;
};
class claseB
{
claseA objeto;
public:
claseB()
{
objeto.a=5; //acceso directo a "a"
}
int damea()
{
return objeto.a; //acceso directo a "a"
}
};
int main () {
claseA elemento1;
cout<<elemento1.damea()<<endl;
claseB elemento2;
cout<<elemento2.damea()<<endl;
}
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.