Mi tarea actual es escribir una lista con iteradores. La lista no está siendo un problema sino la creación de la clase de iterador.Semántica de -> operador en listas (y en general C++)
De un par de fuentes he visto que tengo dos operadores para definir en mi clase de iterador: operator*
y operator->
.
Genial hasta el momento! Suponiendo que la estructura de mi iterador es tan
// Nested class of List
class _Iter
{
private:
ListElem *pCurr;
const List *pList;
public:
_Iter(ListElem *pCurr, const List *list)
: pCurr_(pCurr), pList(list)
{}
T& operator*() { return pCurr_->data; }
T* operator->() { return &**this; }
};
con ListElem siendo
// Nested struct of List
struct ListElem
{
T data;
ListElem *next;
ListElem *prev;
};
puedo ver que estoy haciendo algo mal masivamente (como el doble desreferencia de que esto llevaría a un (* pCurr _-> Datos &), que no es desreferenciable.
Mi problema principal es no comprender qué -> se supone que debe hacer en este caso. ¿Debería otorgarle acceso al usuario a la clase ListElem? Si ese es el caso, ¿por qué no puedo? solo escriba
ListElem *operator->() { return pCurr_; }
¿En lugar de devolver un puntero? Mi comprensión de estos dos operadores, como se usa en mi lista (y esperemos que las listas STL) es que:
operator*() // Return data pointed to by iterator; pCurr_->data;
operator->() // Grant access to data-holding structure; pCurr;
¿Es esto correcto, o lo que no recibo? (¿Y ->
tiene un nombre propio?)
De hecho, a menudo olvido que 'this' es en realidad un puntero. Muy molesto: D – IAE