• Viernes 15 de Noviembre de 2024, 19:47

Autor Tema:  Llamar de una clase a otra  (Leído 2093 veces)

fernandopcg

  • Nuevo Miembro
  • *
  • Mensajes: 4
  • Nacionalidad: es
    • Ver Perfil
Llamar de una clase a otra
« en: Viernes 25 de Marzo de 2011, 19:47 »
0
Hola a todos, es mi primera intervención el el foro, espero que no la última

El caso es que tengo un proyecto  de videojuego en construccion, pero me topo con este problema

-> Estoy usando Bloodshed Dev-C++ 4.9.9.2 y Allegro

Tengo estos archivos:
main.cpp
pantalla.h
bloques.h

en pantalla.h tengo las rutinas de creacion de ventanas y tal,  tambien he implementado el doble buffer
en bloques.h tengo la clase bloque , una de cuyas funciones (void bloques::pintar() donde se dibujan los bloques en pantalla) requiere de acceso   al buffer que hay en pantalla.h

en la main.cpp tengo:

Código: C++
  1.  
  2. #include <allegro.h>
  3. #include <stdlib.h>
  4. #include "pantalla.h"
  5. #include "bloques.h"
  6. (...) otras cosas, ahora empieza la main:
  7. pantalla pant;
  8.     pant.crear();
  9.     pant.creabuffer();
  10.     bloques nivel1;
  11.     nivel1.pintar();
  12.  

desde bloques::pintar() quiero hacer
Código: C++
  1. blit(bloque,pant.buffer,0,0,posx,posy,ancho,alto);
  2.  
pero Dev-C++ me da este error:
In member function `void bloques::generar()': 'pant' undeclared (first use this function)
build error - main.o error 1



La pregunta del millón: Cómo llamar a funciones que se encuentran en otras clases si no se pueden llamar como yo lo he hecho  :ouch:
AL que me ayude a arreglarlo le prmeto que le pongo en los créditos como agradecimientos (Es el "Arkanoid - Primero de carrera edition", por cierto)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Llamar de una clase a otra
« Respuesta #1 en: Viernes 25 de Marzo de 2011, 20:38 »
0
Es obvio que la clase bloques no sabe qué es pant porque lo tienes declarado en otro lugar fuera de la clase. Si lo que quieres es que esta clase tenga visibilidad de este objeto que está declarado en otro lugar tienes varias opciones. La más sencilla es pasarle a la clase bloques un puntero al objeto pant cuando hagas llamadas que necesiten. Otra opción es poner un atributo pantalla* pant en la clase bloques y así definir en qué pantalla se debe dibujar dicho bloque.

Espero haberme explicado. Un saludo.

fernandopcg

  • Nuevo Miembro
  • *
  • Mensajes: 4
  • Nacionalidad: es
    • Ver Perfil
Re: Llamar de una clase a otra
« Respuesta #2 en: Viernes 25 de Marzo de 2011, 20:56 »
0
Gracias por responder, m0skit0, creo que optaré por la segunda.

Lo estoy haciendo, pero visto que los punteros son justamente lo que peor se me quedó, pongo lo que hago para ver si hago bien:

Si he entendido bien es que cada vez que llame a la función pintar(), lo haga así
Código: C++
  1. nivel1.pintar(*pantalla.pant)
  2.  
en lugar de
Código: C++
  1. nivel1.pintar()
  2.  
?
Y luego en la función la cambie para que admita la entrada esta

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Llamar de una clase a otra
« Respuesta #3 en: Viernes 25 de Marzo de 2011, 22:42 »
0
Si pretendes programar en C++, tienes que manejar los punteros como tu propia mano.

Si has decidio la segunda opción

Cita de: "m0skit0"
Otra opción es poner un atributo pantalla* pant en la clase bloques y así definir en qué pantalla se debe dibujar dicho bloque.
entonces no es lo que dices. Lo que yo digo sería algo como

Código: C++
  1. class bloques
  2. {
  3. private:
  4.     pantalla* pant;
  5.  
  6. public:
  7.     [...]
  8.     bloque(pantalla* pant);
  9.     [...]
  10.     void ponPantalla(pantalla* pant);
  11.     pantalla* damePantalla(void);
  12. }
  13.  
Si sólo vas a usar un objeto pantalla podrías incluso definirlo como estático dentro de bloques.

fernandopcg

  • Nuevo Miembro
  • *
  • Mensajes: 4
  • Nacionalidad: es
    • Ver Perfil
Re: Llamar de una clase a otra
« Respuesta #4 en: Viernes 25 de Marzo de 2011, 22:46 »
0
Es verdad, me refería  a la primera opción, que torpe jeje  ^_^

fernandopcg

  • Nuevo Miembro
  • *
  • Mensajes: 4
  • Nacionalidad: es
    • Ver Perfil
Re: Llamar de una clase a otra
« Respuesta #5 en: Sábado 26 de Marzo de 2011, 18:31 »
0
sí, mejor uso la primera opción

¿Entonces está así bien escrito?

Citar
Código: C++
  1. nivel1.pintar(*pantalla.pant)
  2.  
en lugar de
Código: C++
  1. nivel1.pintar()
  2.  

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Llamar de una clase a otra
« Respuesta #6 en: Domingo 27 de Marzo de 2011, 16:51 »
0
Sí, eso es. Igualmente la segunda opción es más correcta si prevés que la pantalla va a ser siempre la misma.