Foros del Web » Programación para mayores de 30 ;) » C/C++ »

como almacenar objetos

Estas en el tema de como almacenar objetos en el foro de C/C++ en Foros del Web. Hola a todos, mi pregunta es como puedo crear un array de objetos, en javascript es asi, lo que voy a poner es solo un ...
  #1 (permalink)  
Antiguo 17/04/2013, 18:41
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 13 años, 8 meses
Puntos: 9
como almacenar objetos

Hola a todos,

mi pregunta es como puedo crear un array de objetos,
en javascript es asi, lo que voy a poner es solo un ejemplo,


this.listaObjetos = [ ];

for(i=0; i<10; i++){
this.nuevoObj = new NuevoObjeto();
this.constructorNuevo('Soy el nuevo', '#FFF000');
this.listaObjetos.push(nuevoObj);
}

mi pregunta es como se hace esto en c++ ???

this.listaObjetos = [ ];
  #2 (permalink)  
Antiguo 17/04/2013, 22:37
Avatar de ggomez91  
Fecha de Ingreso: octubre-2008
Mensajes: 181
Antigüedad: 15 años, 6 meses
Puntos: 13
Respuesta: como almacenar objetos

Puedes hacer un arreglo de apuntadores a objetos e instanciarlos con new:

Código C++:
Ver original
  1. Objeto *objetos = new Objeto[10];
  2. objetos[1]->metodo();

* Para que funcione necesitas un constructor sin parámetros en tu clase Objeto
  #3 (permalink)  
Antiguo 17/04/2013, 23:35
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 13 años, 8 meses
Puntos: 9
Respuesta: como almacenar objetos

gracias por responder, pero necesito que almacene objetos sin saber su tipo

ejemplo:

class Persona{};
class Profesor : public Persona{};
class Alumno : public Persona{};

class Escuela{
private:
this.listaObjetos = [];

void cargaObjetos(){
for(i=0; i<10; i++){

// CARGA OBJETO PROFESOR
this.nuevoProfe = new Profesor();
this.constructorNuevoProfe('Soy el nuevo Profesor');
this.listaObjetos.push(nuevoProfe);

// CARGA OBJETO ALUMNO
this.nuevoAlum = new Alumno();
this.constructorNuevoAlumno('Soy el nuevo Alumno');
this.listaObjetos.push(nuevoAlum);

}
}
};
  #4 (permalink)  
Antiguo 18/04/2013, 08:10
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: como almacenar objetos

Cita:
Iniciado por __SDP__ Ver Mensaje
gracias por responder, pero necesito que almacene objetos sin saber su tipo

ejemplo:

class Persona{};
class Profesor : public Persona{};
class Alumno : public Persona{};

class Escuela{
private:
this.listaObjetos = [];

void cargaObjetos(){
for(i=0; i<10; i++){

// CARGA OBJETO PROFESOR
this.nuevoProfe = new Profesor();
this.constructorNuevoProfe('Soy el nuevo Profesor');
this.listaObjetos.push(nuevoProfe);

// CARGA OBJETO ALUMNO
this.nuevoAlum = new Alumno();
this.constructorNuevoAlumno('Soy el nuevo Alumno');
this.listaObjetos.push(nuevoAlum);

}
}
};
Pero ahí si que sabes su tipo (es un objeto "Profesor").

Eso no te compilará porque listaObjetos no está declarada. Si lo que quieres hacer es un vector:

Código C++:
Ver original
  1. vector<Profesor> Lista;
  2.  
  3. //...
  4.  
  5. Lista.push_back(nuevoProfe);

Necesitas incluir la librería vector:

Código C++:
Ver original
  1. #include <vector>
  #5 (permalink)  
Antiguo 18/04/2013, 09:55
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 13 años, 8 meses
Puntos: 9
Respuesta: como almacenar objetos

Me equivoque en colocar solucionado,
estube revisando la clase vector y no me sirve,
lo que quiero es alamacenar en un array objetos sin importar el tipo

algo asi,

Persona p = new Persona();
Auto a = new Auto;

this.arrayObjetos.push(Persona);
this.arrayObjetos.push(Auto);

eso es gracias,

Última edición por __SDP__; 18/04/2013 a las 14:54
  #6 (permalink)  
Antiguo 18/04/2013, 17:17
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: como almacenar objetos

Cita:
Iniciado por __SDP__ Ver Mensaje
lo que quiero es alamacenar en un array objetos sin importar el tipo
No se pueden mezclar elementos en un vector en C++. Y aunque se pudiera, tampoco recomiendo esa técnica de programación (como distingues un elemento de otro? me parece muy lioso).

Lo más cercano que hay son las template (plantillas):
http://c.conclase.net/curso/?cap=040#inicio
  #7 (permalink)  
Antiguo 18/04/2013, 20:47
 
Fecha de Ingreso: agosto-2010
Ubicación: santiago, CHILE
Mensajes: 564
Antigüedad: 13 años, 8 meses
Puntos: 9
Respuesta: como almacenar objetos

no es tan lioso como te imaginas, sino fuese por el magnifico instanceOf

algo asi:

digamos que quieres hacer algo con un tipo de objeto

for(int i=0; i<10; i++){
if(this.listaObjetos[i] instanceof Profesor){
...
}
}


voy a seguir buscando la forma...todabia no me rindo xD
  #8 (permalink)  
Antiguo 19/04/2013, 04:47
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: como almacenar objetos

Lenguajes distintos implica metodologías distintas de programación. En C++ no se pueden mezclar tipos en un vector porque se necesita saber el tamaño de cada elemento.

No es ninguna limitación puesto que ya conoces el tipo de los datos antes de compilar. Simplemente creas un array de cada elemento en la clase y santas pascuas:
Código C++:
Ver original
  1. Profesor Profesores[10]; // Array de 10 elementos
  2. Alumno Alumnos[10]; // Array de 10 elementos

Es mucho más eficiente y ocupa menos memoria que lo que planteas (JavaScript no hace magia, tiene un montón de funciones y datos internos para permitirte usar esos operadores... C++ solo guarda un puntero al primer elemento para poder localizarlo).

Además te evitas hacer esas comparaciones cada vez que quieras usar un elemento, simplemente tiras de su array correspondiente (o del vector en caso de que quieras cambiar su tamaño en tiempo de ejecución).

¿Que es menos bonito? Como ya te he dicho, es una metodología de programación diferente.
  #9 (permalink)  
Antiguo 19/04/2013, 08:49
Avatar de jariza  
Fecha de Ingreso: agosto-2003
Ubicación: Málaga
Mensajes: 1.449
Antigüedad: 20 años, 8 meses
Puntos: 10
Respuesta: como almacenar objetos

¿Y un array de punteros a void e ir añadiendo punteros a objetos? Suena feísimo pero lo mismo funciona.

Un saludo :)
  #10 (permalink)  
Antiguo 19/04/2013, 11:13
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 10 meses
Puntos: 9
Respuesta: como almacenar objetos

ok puedes crear un clase base de la cual puedes heredar. Por ejemplo

class Cosas
{
public:
virtual string TipoObjeto()
{
return "Cosas";
}
};

class Auto: public Cosas
{
public:
string TipoObjeto()
{
return "Auto";
}
};

class Casa: public Cosas
{
public:
string TipoObjeto()
{
return "Casa";
}
};

//despues vara realizar la conversion utiliza

void fo(Cosas * cosa)
{
Casa *casaObj = dynamic_cast<Casa*>(cosa);
cout<< casaObj->TipoObjeto();
}

aunque esta estrategia te la recomiendo para cuando las clases heredadas tengan algo en común. Creo que deberías especificar mas lo que quieres hacer con el arreglo y así poderte una mejor solución a tu problema.
  #11 (permalink)  
Antiguo 19/04/2013, 12:55
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: como almacenar objetos

Cita:
Iniciado por jariza Ver Mensaje
¿Y un array de punteros a void e ir añadiendo punteros a objetos? Suena feísimo pero lo mismo funciona.

Un saludo :)
No funcionaria porque void no tiene los atributos de las correspondientes.

Cita:
Iniciado por dragg04 Ver Mensaje
ok puedes crear un clase base de la cual puedes heredar. Por ejemplo

class Cosas
{
public:
virtual string TipoObjeto()
{
return "Cosas";
}
};

class Auto: public Cosas
{
public:
string TipoObjeto()
{
return "Auto";
}
};

class Casa: public Cosas
{
public:
string TipoObjeto()
{
return "Casa";
}
};

//despues vara realizar la conversion utiliza

void fo(Cosas * cosa)
{
Casa *casaObj = dynamic_cast<Casa*>(cosa);
cout<< casaObj->TipoObjeto();
}

aunque esta estrategia te la recomiendo para cuando las clases heredadas tengan algo en común. Creo que deberías especificar mas lo que quieres hacer con el arreglo y así poderte una mejor solución a tu problema.
Eso no compila (al menos en Mingw). Además hacer casts hacia abajo no es conveniente (para empezar, estas asumiendo que cosa es una Casa).
  #12 (permalink)  
Antiguo 19/04/2013, 13:00
 
Fecha de Ingreso: junio-2005
Mensajes: 93
Antigüedad: 18 años, 10 meses
Puntos: 9
Respuesta: como almacenar objetos

que IDE utilizas?, supongo que estas en windows. yo lo compile con mingw. utilizando code::blocks. Claro que realizo tal suposion. Pero si no la puedes realizar a priori. puede hacer algo como esto.

void fo(Cosas * cosa)
{
if(dynamic_cast<Casa*>(cosa))
cout<< cosa->TipoObjeto();
else
cout<<"No fue posible realizar la coversión";
}

te paso todo el código.

#include <iostream>

using namespace std;

class Cosas
{
public:
virtual string TipoObjeto()
{
return "Cosas";
}
};

class Auto: public Cosas
{
public:
string TipoObjeto()
{
return "Auto";
}
};

class Casa: public Cosas
{
public:
string TipoObjeto()
{
return "Casa";
}
};

//despues vara realizar la conversion utiliza

void fo(Cosas * cosa)
{

if(dynamic_cast<Casa*>(cosa))
cout<< cosa->TipoObjeto();
else
cout<<"No fue posible realizar la coversión";
}
int main()
{
cout << "Hello world!" << endl;
Cosas *miobjeto = new Casa();
fo(miobjeto);

return 0;
}

si te lanza algun error dime cual es y yo te lo soluciono :D
  #13 (permalink)  
Antiguo 19/04/2013, 13:52
 
Fecha de Ingreso: julio-2012
Mensajes: 375
Antigüedad: 11 años, 9 meses
Puntos: 28
Respuesta: como almacenar objetos

Vaya pues eso si que me compila. Debio ser algo del ejemplo anterior *_*

PD: También uso Codeblocks! ^^

Etiquetas: almacenar, objetos, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:22.