• Jueves 14 de Noviembre de 2024, 04:10

Autor Tema:  Stl Vector De Punteros  (Leído 3136 veces)

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Stl Vector De Punteros
« en: Jueves 22 de Noviembre de 2007, 09:34 »
0
Quería utilizar la stl vector, en lugar de un array, para ir almacenando valores conforme voy necesitando, y no tener que usar un array reservando un número de posiciones y eso.
Los  vectores, con sus instrucciones push_back, size(), ... son bastante cómodos en ese aspecto.
Si lo que realizo es un vector de una variable normal, por decirlo de alguna manera, como un int, un registro con sus campos, ... no hay problema.

Código: Text
  1. vector <int> mivector;
  2.  
  3. mivector.push_back(3); //Almacena el valor 3 en el vector
  4.  
  5. tamaño = mivector.size(); //devuelve el tamaño que tiene actualmente
  6.  
  7.  
Cuando quiera acceder a un elemento en concreto de los que tiene almacenado el vector, puedo acceder a ellos mediante:

Código: Text
  1. elemento=mivector[indice];
  2.  
  3.  

Pero el problema me surge cuando lo que quiero almacenar en el vector no es una variable de ese tipo, sino que quiero almacenar punteros a una clase que tengo creada.
Mi programa va a ir creando nuevos elementos de dicha clase conforme lo va necesitando, y yo en mi vector quiero almacenar punteros a cada uno de los elementos de tipo clase que haya creado.

Ahora mi variable vector será:

Código: Text
  1. vector <*Tclase> mivector2;
  2.  
  3. *Tclase elementonuevo; // tendre que ir almacenando punteros a Tclase
  4. mivector2.push_back(elementonuevo);
  5.  
  6.  
y para trabajar con los métodos de mi clase, de uno de los elementos que tengo en el vector, tendré que hacer:

Código: Text
  1. mivector2[indice]->metododemiclase(parametro1, parametro2);
  2.  
  3.  
¿Es correcto el planteamiento? Es que no termino de tenerlo claro si las definiciones y los accesos a los  metodos de la clase se realizarían de esa manera.

Muchisimas gracias de antemano!  :)

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #1 en: Jueves 22 de Noviembre de 2007, 10:31 »
0
Si, esta bien, misero ejemplo:

Código: Text
  1.  
  2. class persona
  3. {
  4. public:
  5.   int edad;
  6.   void say() { cout << edad << endl; }
  7.   persona(int num) : edad(num) { }
  8. };
  9.  
  10. vector <persona*> todos;
  11. todos.push_back(new persona(23));
  12. todos.push_back(new persona(50));
  13. todos.push_back(new persona(40));
  14. for (int x = 0; x < 3; x++) { todos[x]->say(); }
  15.  
  16.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #2 en: Jueves 22 de Noviembre de 2007, 14:43 »
0
Muchísimas gracias de nuevo Eternal Idol, por tu respuesta.  :)

Un saludo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #3 en: Jueves 22 de Noviembre de 2007, 14:47 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #4 en: Viernes 30 de Noviembre de 2007, 20:47 »
0
Saludos de nuevo. Iba a abrir un nuevo hilo, pero al tratarse de nuevo de procedimientos con la std vector y estar trabajando dentro de una clase creo que sería mejor postearlo aquí.

Bien. Yo dentro de mi clase, utilizo 2 elementos de tipo vector. Uno de ellos almacena punteros a elementos de otra clase, y el otro almacena simplemente un registro, en cada posición, y digamos que los dos están relacionados, y el segundo vector es como un 'registro' de lo que tengo almacenado en el primer vector (sus identificadores y demas..)

Bueno, el problema me ha surgido cuando he intentado eliminar un elemento del vector. (el elemento ha de ser eliminaod de ambos, y en ambos tengo el problema).

Creo que el problema aparece debido a que estoy utilizando la std vector dentro de una Clase.

La eliminación de un elemento, en un vector, se realizaría de la siguiente forma:

Código: Text
  1.  
  2.  
  3.   int posicion=5; //por ejemplo
  4.  
  5.   vector<int>::iterator itRemove = arNumbers.begin() + posicion;
  6.  
  7.   arNumbers.erase(itRemove);
  8.  
  9.  
  10.  
  11.  

El mensaje de error obtenido tras intentar realizar el procedimiento erase, es el siguiente:


Código: Text
  1.  
  2. conversion from '__gnu_cxx::__normal_iterator<L2capChannel**, std::vector<L2capChannel*, std allocator<L2capChannel*> > >' to non-scalar type '__gnu_cxx::__normal_iterator<int*, std::vector<int,std::allocator<int> > >' requested
  3.  
  4.  
  5. no matching function for call to 'std::vector<L2capChannel*,std::allocator<L2capChannel*> > ::erase(__gnu_cxx::__normal_iterator<int*,std::vector<int,std::allocator<int> > >&)'
  6.  
  7.  
  8.  candidates are: typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >) [with _Tp = L2capChannel*, _Alloc = std::allocator<L2capChannel*>]
  9.  
  10.  note C:\Dev-Cpp\include\c++\3.4.2\bits\vector.tcc:108                 typename std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, __gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >) [with _Tp = L2capChannel*, _Alloc = std::allocator<L2capChannel*>]
  11.  
  12.  
  13.  


¿Que puedo hacer? :ayuda:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #5 en: Viernes 30 de Noviembre de 2007, 21:13 »
0
Si como decis es un vector de una clase tuya entonces el problema esta aca:

vector<int>::iterator itRemove = arNumbers.begin() + posicion;

Eso tenes que reemplazarlo por tu clase, siguiendo el ejemplo:

Código: Text
  1.  
  2. vector&#60;persona*&#62;::iterator itRemove = todos.begin() + posicion;
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

captaindanieo

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #6 en: Domingo 2 de Diciembre de 2007, 11:45 »
0
Muchisimas gracias de nuevo EternalIdol.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Stl Vector De Punteros
« Respuesta #7 en: Domingo 2 de Diciembre de 2007, 13:14 »
0
De nadas, mientras se pueda, aca estamos  :comp:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.