Tip C++: Acceder a miembro de clase desde un iterador
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.
loading...


Últimos comentarios