Stratos

Autor Tema: Recorrer objetos de una clase en c++  (Leído 744 veces)

aprendiz2

  • Stratos
  • Mensajes: 9
    • Ver Perfil
Recorrer objetos de una clase en c++
« en: 02 de Agosto de 2012, 03:03:33 pm »
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

  • Stratos
  • Mensajes: 49
    • Ver Perfil
    • julen26's blog
Re: Recorrer objetos de una clase en c++
« Respuesta #1 en: 03 de Agosto de 2012, 10:10:31 am »
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

  • Stratos
  • Mensajes: 272
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #2 en: 03 de Agosto de 2012, 10:22:18 am »
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.
« última modificación: 03 de Agosto de 2012, 10:46:52 am por Gallo »

aprendiz2

  • Stratos
  • Mensajes: 9
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #3 en: 03 de Agosto de 2012, 12:28:10 pm »
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

  • Stratos
  • Mensajes: 272
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #4 en: 03 de Agosto de 2012, 12:43:43 pm »
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

  • Stratos
  • Mensajes: 9
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #5 en: 03 de Agosto de 2012, 12:51:08 pm »
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.
« última modificación: 03 de Agosto de 2012, 01:04:21 pm por aprendiz2 »

julen26

  • Stratos
  • Mensajes: 49
    • Ver Perfil
    • julen26's blog
Re: Recorrer objetos de una clase en c++
« Respuesta #6 en: 03 de Agosto de 2012, 01:04:47 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".

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.

Código: [Seleccionar]
std::vector<Bola> gridBolas;
gridBolas.resize(2); //crear dos objetos de Bola
gridBolas.clear(); //eliminar los objetos

aprendiz2

  • Stratos
  • Mensajes: 9
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #7 en: 03 de Agosto de 2012, 01:12:49 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.

Código: [Seleccionar]
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...

Gallo

  • Stratos
  • Mensajes: 272
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #8 en: 03 de Agosto de 2012, 01:53:00 pm »
Es muy molesto que no sepas usar google:

http://www.cprogramming.com/tutorial/stl/iterators.html

[EX3]

  • Administrador
  • Stratos
  • *****
  • Mensajes: 4839
  • Visual Studio EX3
    • Ver Perfil
    • Visual Studio EX3
Re: Recorrer objetos de una clase en c++
« Respuesta #9 en: 03 de Agosto de 2012, 02:32:41 pm »
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
Sitio web - Twitter - LinkedInGoogle+

Proyecto dx_lib32 - Biblioteca para desarrollo de juegos con DirectX en Visual Basic 6.0 y .NET
Sitio Web - GitHub

aprendiz2

  • Stratos
  • Mensajes: 9
    • Ver Perfil
Re: Recorrer objetos de una clase en c++
« Respuesta #10 en: 03 de Agosto de 2012, 02:42:09 pm »
Gracias por los aportes ¡