Programación General => C/C++ => Mensaje iniciado por: Perseo en Miércoles 22 de Septiembre de 2004, 04:44
Título: Clases Mutuamente Incluidas.. Como???
Publicado por: Perseo en Miércoles 22 de Septiembre de 2004, 04:44
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???
Título: Re: Clases Mutuamente Incluidas.. Como???
Publicado por: Diodo en Miércoles 22 de Septiembre de 2004, 09:56
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
class A
{
public:
friend class B; // A es amiga de B, puede acceder a sus metodos o atributos privados
private:
B* b;
}
class B
{
public:
friend class A; // B es amiga de A, puede acceder a sus metodos o atributos privados
private:
A* a;
}
Ademas no te olvides de incluir los ficheros de cabecera de A.h en la clase B y viceversa
un saludo :hola:
Título: Re: Clases Mutuamente Incluidas.. Como???
Publicado por: chuidiang en Miércoles 22 de Septiembre de 2004, 14:36
Tienes que hacer algo como esto
En el A.h
Código: Text
class B;
class A
{
public B *b;
}
en el B.h
Código: Text
#include <A.h>
class B
{
public A *a;
}
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
#include <B.h> // Este incluye a su vez a A.h
...
En el B.cpp
Código: Text
#include <B.h> // que incluye a su vez a A.h
Se bueno.
Título: Re: Clases Mutuamente Incluidas.. Como???
Publicado por: bufalito en Miércoles 22 de Septiembre de 2004, 16:01
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
class B;
class A
{
private: //tambien puede ser public
B *ObjetoB;
};
UClaseA.cpp
Código: Text
#include <UClaseB.h>
/*esto permite crear objetos de la clase B ya que a partir de aca se encuentra definida dicha clase*/
UClaseB.h
Código: Text
class A;
class B
{
private: //tambien puede ser public
A *ObjetoA;
};
UClaseB.cpp
Código: Text
#include <UClaseA.h>
/*esto permite crear objetos de la clase A ya que a partir de aca se encuentra definida dicha clase*/
¿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.