Foros del Web » Programación para mayores de 30 ;) » C/C++ »

clases

Estas en el tema de clases en el foro de C/C++ en Foros del Web. buenas tardes mi pregunta es simple, como puedo tener acceso a los mienbros de una clase, desde otra....
  #1 (permalink)  
Antiguo 17/05/2014, 13:11
 
Fecha de Ingreso: abril-2011
Ubicación: lima
Mensajes: 134
Antigüedad: 13 años
Puntos: 3
clases

buenas tardes mi pregunta es simple, como puedo tener acceso a los mienbros de una clase, desde otra.
__________________
Solitary wolf..[email protected]
  #2 (permalink)  
Antiguo 17/05/2014, 17:27
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: clases

a ver XD
lo que tienes en private solo puedes acceder desde la misma funcion.
lo que tienes en public puedes acceder desde cualquier parte incluyendo desde otra clase.

Entonces si en una clase en la parte privada tienes algo como un entero edad, esta claro que de otra clase no puedes tener acceso pero si en la parte publica haces una función de forma que retorne la edad si es legal.

Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class a {
  5.     public:
  6.         a() { suEdad = 23; } //El constructor setea suEdad en 23 al crear un objeto como en "claseA"
  7.         ~a(){}
  8.         int getEdad()const{ return suEdad; } //Esta funcion retorna suEdad cuando la invoque
  9.     private:
  10.         int suEdad;
  11. } claseA;  //objeto tipo a, vamos a trabajar con objetos que son como copias de las clases
  12.  
  13. class b {
  14.     public:
  15.         b() { guardaEdad = claseA.getEdad(); } //Esto obtiene la edad de la claseA y la guarda en "guardaEdad"
  16.         ~b(){}
  17.         void imprimir(){ cout << "guardarEdad tiene guardado: " << guardaEdad << endl;  }  
  18.     private:
  19.         int guardaEdad; //guardarEdad va tomar el valor de suEdad del objeto claseA del tipo a ( Otra clase ;) )
  20. }claseB;//Objeto tipo b, esto al igual que el objeto tipo a, es una copia de la clase b, las clases no las tocaremos.
  21.  
  22.  
  23.  
  24. int main (){
  25.  
  26.     //Ahora comprobamos si todo ha ido bien llamando el metodo imprimir de la clase b nos imprimira el 23 que es de la clase a y lo recebimos en la clase b
  27.     claseB.imprimir();
  28.    
  29.     cin.ignore();
  30.     return 0;
  31. }
No es la unica forma de hacer esto.
Puedes crear un objeto tipo a dentro de b y así tener acceso.
Pero basicamente lo que quiero que entiendas es que vas a tener que usar las funciones get y set de la clase, estas funciones no son mas que acceder de forma indirecta a la variable.
enves de hacer esto int variable = 30; no vas a poder por que variable estará en private, pues tendras que hacer algo como esto void set( int unNumero ){ variable = unNumero; }
entonces si la función set esta en la misma clase en la parte publica puedes pasar un numero a la funcion y ella se encarga de almacenar en "variable" dentro de la parte privada ;)

se suele llamar set a las que ponen valor y get a las que retornan valor.

tu----> int variable = 30; //Incorrecto

tu--->public: void set( int unNumero ){ variable = unNumero; } ---> private: int variable; //correcto
Seria asi:
tu---> set(30)---> variable = 30 // tu le pasas 30 a la función y la función mete 30 a la variable que es lo mismo que tu quieres pero de forma indirecta ;)

Última edición por vangodp; 17/05/2014 a las 17:32
  #3 (permalink)  
Antiguo 17/05/2014, 18:33
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: clases

vangodp, creo que no le estás contestando correctamente.

Lo que le estás proponiendo es poder acceder a los miembros de una instancia de una clase que a su vez es miembro de otra.

Lo que creo que busca el autor es poder hacer uso de forma directa de los miembros privados de una clase desde otra.
Si es así, se hace mediante el modificador friend

(Otra forma sería por herencia, pero igualmente creo que no es eso lo que pide el autor del post)

Y si no era eso, pues disculpadme ambos
  #4 (permalink)  
Antiguo 17/05/2014, 21:04
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: clases

Es cierto.
Pero el sistema es el mismo.
tu---> friend funcion(30)---> variable = 30

No puedes acceder a miembros privados directamente de ninguna manera ;)
  #5 (permalink)  
Antiguo 18/05/2014, 10:21
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 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.
  #6 (permalink)  
Antiguo 18/05/2014, 12:19
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: clases

Para saltarse la privacidad de los miembros un mal diseñador de clases puede exponer los miembros privados al retornar su direccion de memoria, o una referencia a ellos.
__________________
Visita mi perfil en LinkedIn

Etiquetas: clases
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:35.