Programación General > C/C++

 Llamar de una clase a otra

(1/2) > >>

fernandopcg:
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++ --- #include <allegro.h>#include <stdlib.h>#include "pantalla.h"#include "bloques.h"(...) otras cosas, ahora empieza la main:pantalla pant;    pant.crear();    pant.creabuffer();    bloques nivel1;    nivel1.pintar(); 
desde bloques::pintar() quiero hacer
--- Código: C++ ---blit(bloque,pant.buffer,0,0,posx,posy,ancho,alto); 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:
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:
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++ ---nivel1.pintar(*pantalla.pant)  en lugar de
--- Código: C++ ---nivel1.pintar() ?
Y luego en la función la cambie para que admita la entrada esta

m0skit0:
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.
--- Fin de la cita ---
entonces no es lo que dices. Lo que yo digo sería algo como


--- Código: C++ ---class bloques{private:    pantalla* pant; public:    [...]    bloque(pantalla* pant);    [...]    void ponPantalla(pantalla* pant);    pantalla* damePantalla(void);} Si sólo vas a usar un objeto pantalla podrías incluso definirlo como estático dentro de bloques.

fernandopcg:
Es verdad, me refería  a la primera opción, que torpe jeje  ^_^

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa