Inicio > Programación > Tip C++: Acceder a miembro de clase desde un iterador

Tip C++: Acceder a miembro de clase desde un iterador

Sábado, 9 de mayo de 2009 Dejar un comentario Ir a comentarios

cpp logo

Otro tip tonto más sobre c++, y es que no me gusta caer dos veces en el mismo error, así que tomo aquí mis notaciones por si algún día me vuelve a surgir la duda :P . Me he encontrado en el caso de que recorriendo un iterador sobre un vector con instancias de una clase personal, quería acceder a un método de la clase desde dicho iterador, y me he encontrado con algún que otro problema. A continuación muestro el caso con el que me he encontrado y la solución.

Si estáis leyendo esta entrada, lo más seguro es que conozcáis que un iterador se suele recorrer de la siguiente forma:

vector<int> v;
// fill up v with data...
for (vector<int>::iterator it = v.begin();
it != v.end(); ++it)
{
cout << *it << endl;
}

Cómo podéis ver, para acceder al contenido del iterador tenemos que utilizar el operador de contenido (*). Sin embargo cuando estamos iterando sobre una clase y queremos acceder a alguno de sus miembros (variables o métodos) no podemos hacerlo de esta forma, mirad lo que ocurre si intentamos compilar el siguiente código:

std::vector<VoxelSort>::iterator it;
for (it=_sortData.begin()+inc; it!=_sortData.end(); it+=inc)
{
_lowscores[index++]= *(--it).getScore();
_upperscores[index]= *it.getScore();
}

Nos aparecerá un error similar a este:

roc.h:365: error: ‘class __gnu_cxx::__normal_iterator<VoxelSort*, std::vector<VoxelSort, std::allocator<VoxelSort> > >’ has no member named ‘getScore’
roc.h:366: error: ‘class __gnu_cxx::__normal_iterator<VoxelSort*, std::vector<VoxelSort, std::allocator<VoxelSort> > >’ has no member named ‘getScore’

Es curioso, pero para acceder a un método o rvalue del objeto al que estamos referenciando por medio de un iterador no es necesario utilizar el operador de contenido (*). Además hay que usar “->” en vez de “.” como cabría esperar. Por lo tanto tendríamos que escribir dicho bloque de código de la siguiente forma:

std::vector<VoxelSort>::iterator it;
for (it=_sortData.begin()+inc; it!=_sortData.end(); it+=inc)
{
_lowscores[index++]= (--it)->getScore();
_upperscores[index]= it->getScore();
}

Si queréis conocer todas las posibles operaciones que podemos realizar con los iteradores os sugiero que echéis un vistazo al siguiente enlace.

GD Star Rating
loading...
Share
  1. Sin comentarios aún.
  1. Sin trackbacks aún.