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 piponazo 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/Bookmark
  1. Sin comentarios aún.
  1. Sin trackbacks aún.