Resolver problemas de programación, funciones útiles tipo forward del Pascal

Tengo un problema cuando quiero hacer esto:
class A
{ B datotipoB;
}
class B
{ A datotipoA;
}
El error de que B aun no esta definido cuando se llega a la clase A .Y se que debe salir este error, pero:
EL PROBLEMA ES COMO RESOLVERLO sin afectar la estructura de las clase,
recuerdo que en pascal existía la sentencia forward para resolver esto entre funciones que se llaman mutuamente, HAY ALGO PARECIDO EN Turbo C++ .

1 Respuesta

Respuesta
1
Realmente una pregunta curiosa la tuya je je ;)
Vale. Veamos. Tu problema reside en lo siguiente:
Cuando se quiere construir un objeto de una cierta clase, primeramente se llama a los constructores de los datos miembros de esa clase. En tu caso, imaginando que el compilador aceptara la definición de clases que haces, imaginate que queremos construir un objeto de la clase A.
Antes de construir el objeto de la clase hay, hay que llamar al constructor de la clase B (ya que hay un objeto de la clase B en la clase A). Cuando se vaya a construir el objeto B, hay que llamar antes al constructor de la clase A, ya que la clase B contiene un objeto de la clase A, pero antes habrá que llamar al constructor de la clase B, pero antes al de la A, al de la B, al de la A, la B, la A, la B, la A, A, B, A, B, A, B... zzzzzzzzZZZZZZzzzzz... vamos que no XDDD
Solución. En vez de utilizar objetos de la otra clase, utiliza punteros a la otra clase. Esto es:
class A
{
B * m_pB;
}
class B
{
A * m_pA;
}
Cuando queramos construir un objeto de la clase A no se llamara al constructor de la clase B, porque con punteros eres tu el encargado de construir el objeto.
Pero esto tb t dara un error, ya q incluyes un objeto de una clase B, cuando todavia no esta definida. Deberas hacer una decleracion anticipada:
class B; //indicamos al compilador
//q hay una clase B todavia no definida
class A
{
B * m_pB;
}
class B
{
A * m_pA;
}
Venga, espero haberte solucionado el problema
Suerte y un saludo,
Raguin

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas