Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Recorrer objetos de una clase en c++

Iniciado por aprendiz2, 02 de Agosto de 2012, 04:03:33 PM

« anterior - próximo »

aprendiz2

Hola a todos, soy nuevo en el foro y tengo una dudilla de c++.
¿como se pueden recorrer mediante un bucle todos los objetos de una clase creados con new?

Necesito tener muchos objetos de la clase "bola" y poder recorrerlos para gestionarlos.

pd: soy noob total en c++, gracias por vuestra ayuda.

julen26

Haz uso de listas, mapas etc... Te recomiendo que le heches un vistazo a la librería estándar STL para usar estos tipos de dato. Pero antes asegúrate de entender todos los conceptos de C++.

Existen discusiones sobre si usar STL o crear estructuras propias, de todos modos no voy a entrar ahi.
Si no quieres complicarte demasiado siempre puedes tirar por los array de punteros, pero a la larga agradeceras el uso de la clase vector<> de la STL y sus propiedades.

Un saludo.

Gallo

#2
Con esto declaras un grid de 64 Bola*

Bola* gridBolas[64];

Para inicializarlo / recorrerlo:

for(int i = 0; i < 64; ++i)
{
   gridBolas[64] = new Bola();
}


Para usarlo como filas y columnas (grid 8x8)

Bola* getBola(columna, fila)
{
   return gridBolas[(columna * 8 ) + fila];
}

Como menciona julen26 algo mas sofisticado es usar

std::vector<Bola*> gridBolas = new std::vector<Bola*>();

por ejemplo. Con un vector así ya tienes algunos métodos muy útiles para manipular y recorrer esa lista de bolas.

aprendiz2

Muchas gracias por la ayuda, pero me preguntaba como se podría crear por ejemplo un emisor de particulas tal y como lo hacía con blit3d (en lenguaje basic).

Veo que en c++ es necesario guardar los objetos nuevos creados en un array para poder recorrerlos luego.
Pero, ¿ no hay ninguna forma de crear objetos de una clase "class bola" y luego recorrer esos objetos mediante un bucle for ?
Porque si entendí bien, siempre se necesita un array declarado como global en el programa para que las funciones puedan acceder a todos los objetos creados dentro del array, no?

Si por ejemplo tengo un juego donde hay varias naves, que disparan varias bolas, que a su vez cada bola emite particulas; tendría que crear 3 arrays globales al inicio del programa ?? uno para cada tipo de objetos multiples a crear, por ejemplo:

class nave {};
class bola {};
class particula {};

nave naves[];
bola bolas[];
particula particulas[]

si ahora quiero crear objetos de esas clases, la pregunta es ¿tengo que crearlos siempre dentro de un array para poder acceder a ellos mediante un bucle for ?? o hay otra manera mas sencilla ?
Porque si no siempre tengo un numero fijo de objetos a crear definido por el array y no puedo crear cuantos yo quiera como hacia con basic.

Gallo

las listas o mapas de la STL son dinámicas, puedes agregar/quitar, los elementos que quieras y se recorren con un for igual pero usando un objecto de tipo iterator<T> en lugar del tipico contador integer.

También puedes crear arrays de un tamaño fijo:   Bola* bolas[2000] y un delimitador del numero de particulas que quieres mostrar:  int limite = 300; de esta forma muestras solo una parte del tamaño máximo del array. Por lo general este segundo metodo se suele utilizar bastante, ya que despues estos arrays acaban siendo buffers de tamaño fijo en la gráfica, y este limitador es el que indica cuantos elementos se dibujan para augmentar o reducir el nº de partículas.

Creo que te falta aprender bastantes conceptos.

aprendiz2

#5
Gracias de nuevo, y tienes razón, me faltan muchos conceptos de c++, vengo de programar con basic y era tan sencillo....
Bueno, resumiendo lo preguntado, necesito crear un array para cada tipo de objeto dinamico que contenga mi juego, sería una buena opcion no?

pd: en basic creaba objetos ilimitados sin estar contenidos dentro de ningun array y luego los recorria mediante for a.bola = each bola

pd2: si quisieras ponerme un ejemplo sencillo de creación de objetos de una clase mediante STL y su recorrido en un for, te lo agradeceria enormemente.

julen26

Cita de: aprendiz2 en 03 de Agosto de 2012, 01:28:10 PM
Veo que en c++ es necesario guardar los objetos nuevos creados en un array para poder recorrerlos luego.
Pero, ¿ no hay ninguna forma de crear objetos de una clase "class bola" y luego recorrer esos objetos mediante un bucle for ?
Porque si entendí bien, siempre se necesita un array declarado como global en el programa para que las funciones puedan acceder a todos los objetos creados dentro del array, no?

Si por ejemplo tengo un juego donde hay varias naves, que disparan varias bolas, que a su vez cada bola emite particulas; tendría que crear 3 arrays globales al inicio del programa ?? uno para cada tipo de objetos multiples a crear, por ejemplo:

class nave {};
class bola {};
class particula {};

nave naves[];
bola bolas[];
particula particulas[]

Crea una clase abstracta llamada por ejemplo "Instancia" y de ahí heredas todas los objetos del juego, luego solo tendrás que guardar todo en una lista de tipo "Instancia".

Cita de: aprendiz2 en 03 de Agosto de 2012, 01:28:10 PM
si ahora quiero crear objetos de esas clases, la pregunta es ¿tengo que crearlos siempre dentro de un array para poder acceder a ellos mediante un bucle for ?? o hay otra manera mas sencilla ?
Porque si no siempre tengo un numero fijo de objetos a crear definido por el array y no puedo crear cuantos yo quiera como hacia con basic.

Ahí está la ventaja de usar la clase "vector" como ya te ha mostrado Gallo. Solo un apunte, cada vez más se recomienda evitar el uso de los operadores new y delete siempre que sea posible, la librería STL hace un buen uso de la memoria. Por ejemplo puedes declarar un vector que no sea de punteros, crear los objetos y al eliminarlos con un "clear()" se llama a los destructores automáticamente.


std::vector<Bola> gridBolas;
gridBolas.resize(2); //crear dos objetos de Bola
gridBolas.clear(); //eliminar los objetos

aprendiz2

Cita de: julen26 en 03 de Agosto de 2012, 02:04:47 PM
Ahí está la ventaja de usar la clase "vector" como ya te ha mostrado Gallo. Solo un apunte, cada vez más se recomienda evitar el uso de los operadores new y delete siempre que sea posible, la librería STL hace un buen uso de la memoria. Por ejemplo puedes declarar un vector que no sea de punteros, crear los objetos y al eliminarlos con un "clear()" se llama a los destructores automáticamente.


std::vector<Bola> gridBolas;
gridBolas.resize(2); //crear dos objetos de Bola
gridBolas.clear(); //eliminar los objetos


Es mucho pedir un ejemplo de una clase por ejemplo "class bola" y luego el uso de vector para crear objetos y el uso de for para recorrerlos y para borrarlos usando STL...
perdonar si son muy noobs las preguntas...


[EX3]

Un aporte, aprendiz2, si estas empezando con C++ pasate por esta web y ve empezando por lo basico.

http://c.conclase.net/

Si vienes del Basic, y encima el Basic del Blitz3D que es lo mas raro que he visto en Basic en años (nada que ver con implementaciones clasicas como GW-Basic o Turbo Basic), vas a necesitar mucha desintoxicacion (mas que la que necesite yo despues de 10 años de Visual Basic 6.0) para entender como se suele programar en el resto de lenguajes :P

Salu2...

P.D.: Y si, intenta Googlear un poco que muchas dudas basicas las puedes encontrar resueltas por la red.
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

aprendiz2







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.