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

Relaciones Cíclicas entre clases

Estas en el tema de Relaciones Cíclicas entre clases en el foro de C/C++ en Foros del Web. Supongamos que tengo tres clases definidas en archivos distintos: la clase A, B y C. Resulta que la clase A tiene un objeto de la ...
  #1 (permalink)  
Antiguo 08/11/2011, 22:00
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Relaciones Cíclicas entre clases

Supongamos que tengo tres clases definidas en archivos distintos: la clase A, B y C. Resulta que la clase A tiene un objeto de la clase B, la B a su vez tiene un objeto de la clase C y la C tiene uno de la clase A. ¿Cómo tendría que hacer el makefile para que no me de un error cuando compile?

Gracias!!
  #2 (permalink)  
Antiguo 09/11/2011, 07:25
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Relaciones Cíclicas entre clases

Esto es asi. Primeros debes separar la implementacion de la declaracion. Separa bien lo que son los .h de los .cpp

Otro paso es usar las macros en los .h para evitar la declaraciones ciclicas. Ejemplo:

Código C++:
Ver original
  1. #ifndef HOLA
  2. #define HOLA
  3.  
  4. class A {}
  5.  
  6. #endif

Luego en cada archivo de cabecera incluir el correpondiente archiv .h necesario y pero en uno de ellos hay que agregar una simple declaracion de clase: class A;

Código C++:
Ver original
  1. #ifndef CLASE_A
  2. #define CLASE_A
  3.  
  4. #include "B.h"
  5. class B;
  6. class A {
  7.     B * b;
  8.  
  9. }
  10.  
  11. #endif

Código C++:
Ver original
  1. #ifndef CLASE_B
  2. #define CLASE_B
  3. #include "C.h"
  4. class C;
  5. class B {
  6.      C * c;
  7. }
  8.  
  9. #endif

Código C++:
Ver original
  1. #ifndef CLASE_C
  2. #define CLASE_C
  3. #include "A.h"
  4. class A;
  5.  
  6. class C {
  7.      A * a;
  8. }
  9.  
  10. #endif

Una vez tuve este problema y creo haberlo resuelto asi. Ahora no me puedo fijar...mas tarde me fijo bien. Prueba con esta opcion mientras.
  #3 (permalink)  
Antiguo 09/11/2011, 09:54
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Respuesta: Relaciones Cíclicas entre clases

Probé esa solución pero entonces me surgía otro problema: Desde el programa principal me declaraba una variable de tipo A y desde esa variable quería acceder a un método de la clase B. ¿Cómo tendría que definir el acceso? Lo digo por el tema de los punteros. El fallo que me daba era una violación de segmento al ejecutarlo.
  #4 (permalink)  
Antiguo 09/11/2011, 11:33
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Relaciones Cíclicas entre clases

Bueno, pero ya solucionamos el problema de compilacion.
Para solucionar este otro problema voy a necesitar que muestrar un poco de codigo.
  #5 (permalink)  
Antiguo 09/11/2011, 12:43
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Respuesta: Relaciones Cíclicas entre clases

Voy a poner un ejemplo porque el programa que estoy usando ya es bastante grande y así creo que se verá más fácil:

En un archivo distinto creo el main del programa:
Ahí declaro un objeto de tipo A.
------------------------------------------------------------
main.cpp:


#include "A.h"

A objeto1;

int main()
{


return 0;
}
------------------------------------------------------------

En A.h tenemos un objeto de tipo B

-----------------------------------------------------------
A.h:


#ifndef CLASE_A
#define CLASE_A

#include "B.h"

class B;

class A {

B * objeto2;

}

#endif
-----------------------------------------------------------

Y en la clase B declaramos un método que, por ejemplo, suma 1 a una variable de la clase:

-----------------------------------------------------------
B.h:

#ifndef CLASE_B
#define CLASE_B
#include "C.h"
class C;
class B {

int n = 0;
void sumar();

C * c;

}

#endif
-----------------------------------------------------------

La clase C sigue igual.

Para llamar desde el main al método sumar() de la clase B tendría que ser a través del objeto de tipo A. Yo he probado haciéndolo así:

(*(*objeto1).objeto2).sumar();

y compilaba sin problemas, pero a la hora de ejecutar me salía una Violación de Segmento, ¿dónde está el fallo?
  #6 (permalink)  
Antiguo 09/11/2011, 17:47
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 7 meses
Puntos: 228
Respuesta: Relaciones Cíclicas entre clases

Pasa que el puntero del objeto B que esta en A nunca fue inicializado.

dentro de A deberia haber un

objeto2 = new B;

y obviamente dentro de B un

objeto3 = new C;
  #7 (permalink)  
Antiguo 09/11/2011, 21:26
 
Fecha de Ingreso: noviembre-2011
Ubicación: Murcia
Mensajes: 11
Antigüedad: 13 años
Puntos: 0
Respuesta: Relaciones Cíclicas entre clases

Era eso!! Ya no me sale la violación de segmento!! Muchas gracias!! Me estás ayudando más que muchos profesores!! ;)

Etiquetas: clase, clases, relaciones
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 09:04.