SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: UnMandrango en Miércoles 19 de Enero de 2011, 21:42

Título: Pregunta sobre listas
Publicado por: UnMandrango en Miércoles 19 de Enero de 2011, 21:42
Una pregunta simple: ¿Es posible en C++ crear una clase Lista o Array que sea capaz de contener diferentes tipos de objetos o incluso anidar otras listas dentro?

Por mas que he buscado no he sacado nada en claro. Gracias!
Título: Re: Pregunta sobre listas
Publicado por: UnMandrango en Domingo 23 de Enero de 2011, 12:50
:hitcomp:
Título: Re: Pregunta sobre listas
Publicado por: budoky en Domingo 23 de Enero de 2011, 13:05
Es perfectamente posible crear una lista de los elementos que tu quieras, hay multiples formas de hacerlo, te recomiendo usar la libreria vector, en ella encontraras el template de la clase vector. Acabo de registrarme y no puedo publicar enlaces pero si buscas en google [libreria vector c++] o algo similar encontraras facilmente documentación sobre ella.

Un Saludo.
Título: Re: Pregunta sobre listas
Publicado por: m0skit0 en Domingo 23 de Enero de 2011, 14:48
Te la puedes montar tú mismo usando void*, malloc y free

Saludos.
Título: Re: Pregunta sobre listas
Publicado por: UnMandrango en Domingo 23 de Enero de 2011, 15:00
Hola, gracias a ambos por responder. La clase vector no me sirve porque tengo que especificar el tipo, y lo que necesito es poder tener cualquier tipo y/o objetos en la misma lista.

Ya intente hacer mi propia clase con void* el problema esta a la hora de acceder a los elementos, voy a copiar el código, por ahora solo tengo dos métodos, para añadir y para acceder.

Código: C++
  1. #ifndef LIST_H
  2. #define LIST_H
  3.  
  4. class List
  5. {
  6.     public:
  7.         int size;
  8.         void ** nodes;
  9.  
  10.         List();
  11.         virtual ~List();
  12.  
  13.         void * operator [] (unsigned int index);
  14.  
  15.         void Add(void * item);
  16.     protected:
  17.     private:
  18. };
  19.  
  20. List::List()
  21. {
  22.     size = 0;
  23.     nodes = (void **)malloc(64*sizeof(void *));
  24. }
  25.  
  26. List::~List()
  27. {
  28.  
  29. }
  30.  
  31. void * List::operator [] (unsigned int index)
  32. {
  33.     return nodes[index];
  34. }
  35.  
  36. void List::Add(void *item)
  37. {
  38.     nodes[size] = item;
  39.     size++;
  40. }
  41.  
  42. #endif // LIST_H
  43.  
  44.  

y aquí lo que intento desde el main:

Código: C++
  1. #include <cstdlib>
  2. #include <cstdio>
  3.  
  4. #include "List.h"
  5. #include "Service.h"
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11.     List lista;
  12.  
  13.     Service * serv = new Service;
  14.  
  15.     lista.Add(serv);
  16.  
  17.     lista[0]->Move();
  18.  
  19.     return 0;
  20. }
  21.  

El error:
error: ‘void*’ is not a pointer-to-object type

Supongo que casteando el puntero void que me devuelve al objeto adecuado podría acceder a él, pero si tengo diferentes tipos de objetos, como saber que objeto me devuelve?

Saludos!
Título: Re: Pregunta sobre listas
Publicado por: m0skit0 en Domingo 23 de Enero de 2011, 22:46
Cita de: "UnMandrango"
Supongo que casteando el puntero void que me devuelve al objeto adecuado podría acceder a él, pero si tengo diferentes tipos de objetos, como saber que objeto me devuelve?
Eso ya depende de cómo lo implementes tú. Ten en cuenta que si la lista contiene todo tipo de objetos, tienes que poder distinguir cada cuál. Podrías usar un tipo enumerado con los objetos que vayas a guardar en la lista, y lo incluyes en el nodo de la lista. También puede ser una buena idea incluir el tamaño del dato del nodo.

Saludos
Título: Re: Pregunta sobre listas
Publicado por: UnMandrango en Martes 25 de Enero de 2011, 21:06
He estado dando vueltas al tema... y creo que no voy por el camino correcto.

Me voy a explicar, donde yo trabajo tienen un game engine propio, este tiene su propio lenguaje script y lo interpreta en tiempo de ejecución. Me he acostumbrado mucho a este lenguaje y me gustaría utilizar algunas características de él en C++/SDL para crear mis juegos. Y para empezar lo primero que necesitaría es tener un tipo de variable global: Todas las variables pueden ser enteros, flotantes, booleanos, cadenas o cualquier objeto. Es algo así como un tipo de variable puntero pero que puede apuntar a cualquier tipo u objeto y acceder a sus propiedades o métodos.

Luego están las listas, aquí puedo crear listas que contengan todo tipo de objetos diferentes, pero claro, realmente quizás todo es el mismo objeto "puntero global". Incluso la lista seria un puntero porque se pueden anidar. Así si seria fácil.

Yo no puedo acceder al código de ese motor para ver como esta hecho por dentro. Por eso pregunto, es posible crear algo así en C++?

Se puede guardar en una variable el typeid de un objeto para luego castear usando esta variable? Se puede castear punteros void a punteros objeto sin saber el tipo, solo su tamaño?

Gracias!  :hola:
Título: Re: Pregunta sobre listas
Publicado por: •Parra en Martes 25 de Enero de 2011, 21:22
Cita de: "UnMandrango"
He estado dando vueltas al tema... y creo que no voy por el camino correcto.

Me voy a explicar, donde yo trabajo tienen un game engine propio, este tiene su propio lenguaje script y lo interpreta en tiempo de ejecución. Me he acostumbrado mucho a este lenguaje y me gustaría utilizar algunas características de él en C++/SDL para crear mis juegos. Y para empezar lo primero que necesitaría es tener un tipo de variable global: Todas las variables pueden ser enteros, flotantes, booleanos, cadenas o cualquier objeto. Es algo así como un tipo de variable puntero pero que puede apuntar a cualquier tipo u objeto y acceder a sus propiedades o métodos.

Luego están las listas, aquí puedo crear listas que contengan todo tipo de objetos diferentes, pero claro, realmente quizás todo es el mismo objeto "puntero global". Incluso la lista seria un puntero porque se pueden anidar. Así si seria fácil.

Yo no puedo acceder al código de ese motor para ver como esta hecho por dentro. Por eso pregunto, es posible crear algo así en C++?

Se puede guardar en una variable el typeid de un objeto para luego castear usando esta variable? Se puede castear punteros void a punteros objeto sin saber el tipo, solo su tamaño?

Gracias!  :hola:
Es que depende de lo que quieras hacer.. a ver, lo más practico y reutilizable que se me ocurre para un usuario, de hacer una lista para poder guardar diferentes tipos de variables, o estructuras dentro es esto:

(Codigo en C)
Código: C
  1.  
  2. #define LIST_TYPE_INT      1
  3. #define LIST_TYPE_FLOAT 2
  4. #define LIST_TYPE_...
  5.  
  6. struct Node
  7. {
  8.        int type; // tipo de datos
  9.        void * data; // datos
  10. };
  11.  
  12. #define LIST_MAX_SIZE 0xFF
  13.  
  14. struct Node List[LIST_MAX_SIZE];
  15.  
  16. // Ahora, cuando quieras guardar algo en el array, puedes hacer funciones de este tipo
  17. int PutInt(int value)
  18. {
  19.      // Busco un slot libre
  20.      int i;
  21.      for (i = 0; i < LIST_MAX_SIZE; i++)
  22.      {
  23.            if (List[i].Type == 0) // recuerda, que deberias de iniciar la lista..
  24.                   break;
  25.      }
  26.      
  27.      // guardamos el int
  28.      // ...
  29.  
  30.      // recuerda de asignar el type
  31.  
  32.      return i; // devolvemos la dimension
  33. }
  34.  
  35. // luego tendrias una funcion inversa
  36. int GetInt(int slot)
  37. {
  38.       // retornarias los datos..
  39. }
  40.  
  41.  

Lo bueno de usar una variable para indicar el type, es que luego podrias usar algo tipo "parser", y sacar los datos rapidamente.. De todos modos me imagino que con C++ podrás hacerlo mucho más facil y sencillo gracias a OOP, por ejemplo, usando templates, por ahi te vendrán de perlas.. pero a mi se me resiste un poco OOP :P

De todos modos.. creo que estás iendote por las ramas, cual es el sistema 'general' que quieres realizar?