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

Alguien sabe como acer esto?

Estas en el tema de Alguien sabe como acer esto? en el foro de C/C++ en Foros del Web. Miren, tengo una clase Avion, cada avion tiene como atributo una clase Armas, y Armas a su vez tiene Disparo y Misil, pues bien Misil ...
  #1 (permalink)  
Antiguo 07/11/2006, 11:10
 
Fecha de Ingreso: noviembre-2006
Mensajes: 19
Antigüedad: 17 años, 6 meses
Puntos: 0
Alguien sabe como acer esto?

Miren, tengo una clase Avion, cada avion tiene como atributo una clase Armas, y Armas a su vez tiene Disparo y Misil, pues bien Misil tiene que tener un atributo k es Avion (sera un enemigo) ya que es el objetivo del misil, pues bien, no me compila, y al cambiar el atributo Avion de Misil por un "void * objetivo" si me funciona bien (al usarlo solo tengo k acer un castin y ya esta). Me imagino ke el fallo esta en que se hace un abrazo mortal entre ambas clases, sabeis como puedo acer solucionar este problema sin usar el void* ??????


gracias
  #2 (permalink)  
Antiguo 07/11/2006, 11:56
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
¿Probaste con class Avion;?

El suicidio del avioncito de papel:

Código:
class Avion;

class Arma
{
  public:
  int tipo;
  int size;
  void disparar() { }
};

class Misil : public Arma
{
public:
  Avion *Enemigo;
};

class Avion
{
  public:
  Misil arma1;
};

void main()
{
  Avion papel;
  papel.arma1.tipo = 0;
  papel.arma1.size = 0;
  papel.arma1.Enemigo = &papel;
  papel.arma1.disparar();
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 07/11/2006, 11:58
 
Fecha de Ingreso: noviembre-2006
Mensajes: 19
Antigüedad: 17 años, 6 meses
Puntos: 0
no lo e probao, de echo no sabia k existia eso, voi a leer un poco para saber que eso exactamente, lo pruebo y os digo
  #4 (permalink)  
Antiguo 07/11/2006, 12:34
 
Fecha de Ingreso: noviembre-2006
Mensajes: 19
Antigüedad: 17 años, 6 meses
Puntos: 0
He solucionado el problema que tenia pero aora a surgido otros a raiz de este, mira tu codigo modificado:

Cita:
class Avion;

class Arma
{
public:
int tipo;
int size;
};

class Misil : public Arma
{
public:
void disparar() {
enemigo->funcion();
}

Avion *Enemigo;
};

class Avion
{
public:
void funcion() { }
Misil arma1;
};

void main()
{
Avion papel;
papel.arma1.tipo = 0;
papel.arma1.size = 0;
papel.arma1.Enemigo = &papel;
papel.arma1.disparar();
}
al intentar usar la clase me dice k no es un uso apropiado, como si no existiera la funcion, cosa logica ya que hasta ese punto solo se ha definido una clase Avion sin ningun metodo ni atributo.

x cierto, no e encontrado para que sirve eso del class Avion; , es decir, no se si simplemente es crear una clase vacia para que crea que exista y luego redefinirla o es algun truco de C++ para estos casos... podrias indicarme para que sirve exactamente??

Gracias por la ayuda
  #5 (permalink)  
Antiguo 07/11/2006, 14:02
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Cita:
Iniciado por MiToNiOeS Ver Mensaje
x cierto, no e encontrado para que sirve eso del class Avion; , es decir, no se si simplemente es crear una clase vacia para que crea que exista y luego redefinirla o es algun truco de C++ para estos casos... podrias indicarme para que sirve exactamente??
Es para declararla, despues la definis. Para tu problema si sacas el codigo fuera podes hacer esto:

Código:
class Avion;

class Arma
{
public:
int tipo;
int size;
};

class Misil : public Arma
{
public:
Avion *Enemigo;

void disparar();
};

class Avion
{
public:
void funcion() { }
Misil arma1;
};

void Misil::disparar()
{
  Enemigo->funcion();
}


void main()
{
Avion papel;
papel.arma1.tipo = 0;
papel.arma1.size = 0;
papel.arma1.Enemigo = &papel;
papel.arma1.disparar();
}
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 07/11/2006, 14:50
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Deberías hacer otro diseño.

disparar() debería ser un miembro virtual de Arma, que tome un parámetro que sea una referencia a un Avión. No debería hacer falta nada más. En caso de que el arma necesitase un comportamiento específico, redefines la función en la clase Misil o la que fuese.
  #7 (permalink)  
Antiguo 07/11/2006, 16:16
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
podrias cambiar el diseño.
una Interfas ObjetoVolador te ayudaria ya que no solo destruirias aviones, tambien otro tipo de objetos voladores(asta OVNIS..jeje).
esta interfase tendria los metodos virtuales necesarios para identificar y localizar el blanco. ademas no creo que la funcion disparar tenga que ser parte de Misil, sino de Avion.

ejemplo:

class Avion
{
bool Disparar()
{
if(msls[num])msls[num]->enable();
}

del blanco el misil se encargaria , a menos que fuese un misil guiado desde la cabina o desde radar.

bool Disparar()
{
if(msls[num])
{
msls[num]->SetCoords(this->radar->GetCoords());
msls[num]->SetEnable(true);
}
}

solo sugerencia. Saludos.
  #8 (permalink)  
Antiguo 08/11/2006, 00:33
 
Fecha de Ingreso: noviembre-2006
Mensajes: 19
Antigüedad: 17 años, 6 meses
Puntos: 0
Cita:
podrias cambiar el diseño.
una Interfas ObjetoVolador te ayudaria ya que no solo destruirias aviones, tambien otro tipo de objetos voladores(asta OVNIS..jeje).
esta interfase tendria los metodos virtuales necesarios para identificar y localizar el blanco. ademas no creo que la funcion disparar tenga que ser parte de Misil, sino de Avion.
exacto, eso es justo lo k avia echo. todos los objetos de la simulacion que pueden colisionar heredan de una clase llamada "Colisionable" y es esta clase la que he utilizado. Esta clase tiene un atributo llamado body y de el puedo sacar la posicion, ke es lo unico que le interesa a Misil (para poder guiarse e irse a por la nave objetivo)
  #9 (permalink)  
Antiguo 08/11/2006, 08:10
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por Nivel7 Ver Mensaje
podrias cambiar el diseño.
una Interfas ObjetoVolador te ayudaria ya que no solo destruirias aviones, tambien otro tipo de objetos voladores(asta OVNIS..jeje).
esta interfase tendria los metodos virtuales necesarios para identificar y localizar el blanco. ademas no creo que la funcion disparar tenga que ser parte de Misil, sino de Avion.

ejemplo:

[...]

solo sugerencia. Saludos.
Ahh... Mi mismo mensaje repetido... Es desesperante lo tuyo, de verdad.
  #10 (permalink)  
Antiguo 08/11/2006, 16:17
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años
Puntos: 2
Si ya tienes una interfas de este tipo, no es necesario que la Clase Misil tenga un puntero a Avion sino a Colisionable, tal vez podrias pasar el objeto como parametro. para evitar el problema que haz tenido con las referencias circulares.

ademas creo que una Interfas Colisionable es muy generalizada y mas si un misil sera guiado a un objeto de ese tipo.. bien podria ser una montaña, el mismo suelo.
(no por que sea el objeto apuntado un Colisionable , sino por que podra apuntar a cualquiera que deribe de esta Interfas).

pero si tu diseño a contemplado estos puntos... esta bien.

Saludos.
  #11 (permalink)  
Antiguo 10/11/2006, 00:35
 
Fecha de Ingreso: noviembre-2006
Mensajes: 19
Antigüedad: 17 años, 6 meses
Puntos: 0
si, es eso lo ke e echo, y como parametro le paso el objeto pero lo que recibe la funcion es un colisionable:

Cita:
// Nave01
....
misil->disparar(nave02);
....

// Misil
void Misil::disparar(Colisionable *c) {
...
Vector3 posicionObjetivo = c->getPosicion( );
...
}
algo asi ace y ya funciona bien, por cierto hay cosas que pueden colisionar pero que no heredan de colisionable, como por ejemplo el terreno. Colisionable es todo aquello que puede colisionar y que puede ser destruido
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 12:31.