• Viernes 28 de Junio de 2024, 07:05

Autor Tema:  Clases Mutuamente Incluidas.. Como???  (Leído 1639 veces)

Perseo

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Clases Mutuamente Incluidas.. Como???
« en: Miércoles 22 de Septiembre de 2004, 04:44 »
0
Tengo dos clases A y B, necesito hacer lo siguiente, cada clase debe tener como atributo un puntero a un objeto de la otra de la siguiente manera:

class A{
private:
   B* b;
}

class B{
private:
   A* a;
}

pero el compilador no me lo permite... que debo hacer???
[size=109]Perseo.[/size]

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Clases Mutuamente Incluidas.. Como???
« Respuesta #1 en: Miércoles 22 de Septiembre de 2004, 09:56 »
0
Hola

Lo que debes hacer es decir que ambas clases son amiguitas
Para ello se usa el comando friend

Seria algo tal que asi:

Código: Text
  1.  
  2. class A
  3. {
  4. public:
  5. friend class B; // A es amiga de B, puede acceder a sus metodos o atributos privados
  6. private:
  7. B* b;
  8. }
  9.  
  10. class B
  11. {
  12. public:
  13. friend class A; // B es amiga de A, puede acceder a sus metodos o atributos privados
  14. private:
  15. A* a;
  16. }
  17.  
  18.  


Ademas no te olvides de incluir los ficheros de cabecera de A.h en la clase B y viceversa


un saludo  :hola:

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Clases Mutuamente Incluidas.. Como???
« Respuesta #2 en: Miércoles 22 de Septiembre de 2004, 14:36 »
0
Tienes que hacer algo como esto

En el A.h
Código: Text
  1.  
  2. class B;
  3.  
  4. class A
  5. {
  6.    public B *b;
  7. }
  8.  
  9.  

en el B.h
Código: Text
  1.  
  2. #include <A.h>
  3.  
  4. class B
  5. {
  6.    public A *a;
  7. }
  8.  
  9.  

De esta forma el include no es "recursivo". Si A.h incluye a B.h y este a su vez a A.h el compilador no termina nunca, y te da un error de que no puede abrir fichero (supongo que es lo que te pasa).

Luego, en los ficheros .cpp tienes que poner un include de mas

En A.cpp
Código: Text
  1.  
  2. #include <B.h> // Este incluye a su vez a A.h
  3. ...
  4.  
  5.  

En el B.cpp
Código: Text
  1.  
  2. #include <B.h> // que incluye a su vez a A.h
  3.  
  4.  

Se bueno.

bufalito

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Clases Mutuamente Incluidas.. Como???
« Respuesta #3 en: Miércoles 22 de Septiembre de 2004, 16:01 »
0
Hola,

La solución que te planteo a acontinuación es MUY parecida a la de CHUIDIANG salvo en algunas cosillas que considero importantes:

UClaseA.h
Código: Text
  1.  
  2. class B;
  3.  
  4. class A
  5. {
  6. private: //tambien puede ser public
  7.   B *ObjetoB;
  8. };
  9.  
  10.  

UClaseA.cpp
Código: Text
  1.  
  2. #include <UClaseB.h>
  3. /*esto permite crear objetos de la clase B ya que a partir de aca se encuentra definida dicha clase*/
  4.  
  5.  

UClaseB.h
Código: Text
  1.  
  2. class A;
  3.  
  4. class B
  5. {
  6. private: //tambien puede ser public
  7.   A *ObjetoA;
  8. };
  9.  
  10.  

UClaseB.cpp
Código: Text
  1.  
  2. #include <UClaseA.h>
  3. /*esto permite crear objetos de la clase A ya que a partir de aca se encuentra definida dicha clase*/
  4.  
  5.  

¿Y cuales son las diferencias? Pues que ninguna de las cabeceras (los archivos .h) poseen inclusiones de ningun tipo, esto hace mucho mas "compilable e independiente" tu código. En realidad, la teoría nos dice que así debería de hacerse el código anterior puesto que ni la clase A tiene un objeto B y tampoco la clase B tiene un objeto A, lo que en realidad tienen son referencias a objetos de ese tipo.

Saludos,

Bufalito