elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con metodos friend con clases en distintos ficheros header (SOLUCIONADO)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda con metodos friend con clases en distintos ficheros header (SOLUCIONADO)  (Leído 1,998 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Duda con metodos friend con clases en distintos ficheros header (SOLUCIONADO)
« en: 23 Febrero 2013, 02:38 am »

Hola a todos, expongo mi duda:

Tengo dos clases A y B, ambas tienen por un lado su fichero de cabecera ("A.h") y su fichero de definición o como lo queráis llamar ("A.cpp"). Por tanto están en ficheros separados y se enlazan con includes.

Lo que quiero es definir un método en la clase B que pueda acceder a los atributos private de la clase A, y para ello voy a usar un método friend pero no se como enlazar los ficheros para que se pueda hacer. Quiero hacer algo como:

Código:
//Dfinicion de la clase B:
....
....
void B::metodoEnCuestion(A *a){
      a->n=25;
}


//Declaracion de la clase A:
....
private: int n;
....
friend void B::metodoEnCuestion(A *);
....

He buscado en varias webs y en google, y encuentro cosas de métodos friend pero no encuentro como hacerlo con 2 clases en distintos ficheros con includes.

El caso es que lo he intentado de varias maneras pero no se como hacerlo, me ayuda alguien por favor?

Muchas gracias.



« Última modificación: 24 Febrero 2013, 19:12 pm por SARGE553413 » En línea

SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Duda con metodos friend(SOLUCIONADO)
« Respuesta #1 en: 24 Febrero 2013, 19:11 pm »

Hola de nuevo, en vista de que no contestaba nadie he seguido "haciendo experimentos" hasta que he dado con la solución. La expongo a continuación, AVISO creo que quedará un post muy largo, igual os aburrís, ahí va:

Recordando el problema, tenemos 2 clases independientes, cada una son su fichero *.h y su fichero .*cpp respectivamente, llamemoslas A y B, queremos que B tenga un, y solo un método capaz de acceder a las partes privadas de A:

Comenzamos con la declaración de A:
Código:
#include "B.h"
/* Incluimos el fichero de cabecera en A para que el compilador conozca la clase B
y sus métodos, de lo contrario no podríamos hacer ninguna referencia a los métodos de B, como si fuésemos a hacer una relación de agregación*/

#ifndef A_H
#define A_H 1

class A{
private:
   int n; //por ejemplo..

   friend void B::hola(A *);
   /* le decimos a A que este método de B podrá acceder a sus partes privadas*/

/* como se puede observar, esta declaración es private, creo que es lo mas       lógico ya que se trata de que solo el metodo hola de B pueda acceder a A, luego debería ser información "restringida" para las demás clases, aunque es posible que de lo mismo ponerla public o private, no lo sé :P */
   ....
public:
   ....
   etc.
};

#endif

/*Nota: el *.cpp de A no lo pongo porque no hace falta, se hace todo igual que siempre*/

Veamos que hacer en B
Código:
#ifndef B_H
#define B_H 1

/*Dentro de B, avisamos al compilador de que hay una clase llamada A. Como estamos en la parte de declaración, no es necesario saber ahora mismo como es o que tiene la clase A. IMPORTANTE: no poner #include "B.h" porque entonces el compilador da error, me imagino que se forma una especie de bucle con los includes, nunca paran de incluirse mutuamente*/
class A;

class B{
private:
...
...

public:
...
void hola(A *);
/*es importante que el método en cuestión reciba como argumento un puntero a A, me explico:
el compilador siempre sabe como pasar una dirección ya que es de tamaño fijo, sin importar el tipo o a lo que apunte, sin embargo si intentamos pasar el objeto en sí,  el compilador necesitará saber como es el objeto "por dentro", y no podemos darle esa información ya que no podemos usar #include "A.h" */

#endif

Hasta aquí el *.h de B, veamos ahora que hacer en su *.cpp

Código:
/* B.cpp */

#include "B.h"  //lo tipico
#include "A.h" /*aquí si que podemos ponerlo sin que el compilador llore, y nos hace falta porque vamos a hacer referencia a atributos etc. private de A, luego el compilador deber saber como es A*/

void B::hola(A *a){
a->n=25; //correcto, y 'n' en A es private ;)
}


Y eso es todo, espero le sirva a alguien.

Saludos.


« Última modificación: 24 Febrero 2013, 19:27 pm por SARGE553413 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funcion Friend? Como Funciona?
Programación Visual Basic
ranslsad 3 2,155 Último mensaje 10 Diciembre 2007, 15:46 pm
por ranslsad
spiderman friend or foe
Juegos y Consolas
mariceli 0 1,523 Último mensaje 21 Agosto 2008, 20:18 pm
por mariceli
Duda en convinacion de metodos de seguridad
PHP
Skeletron 3 2,365 Último mensaje 19 Diciembre 2009, 22:35 pm
por braulio--
sobrecarga de metodos, se puede aplicar en metodos abstract o interfaces?
Desarrollo Web
jhonatanAsm 0 3,219 Último mensaje 16 Agosto 2011, 00:22 am
por jhonatanAsm
Problemas con Google Friend Connect
Desarrollo Web
¡Micronet! 0 1,827 Último mensaje 6 Diciembre 2011, 19:10 pm
por ¡Micronet!
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines