Gli iteratori si devono costruire in base al container che si vuole sviluppare. Il link si riferisce ai requisiti che le varie tipologie di iteratori devono soddisfare per essere conformi allo standard. Soddisfatti i requisiti, puoi usqare il tuo container come fosse standard.
Quindi dato che la tua lista bob è bidirezionale, devi implementare il forward iterator.
Il dato privato (che è quello che ti interessa) è: ListNode<NODETYPE>*
Il costruttore di default setta il dato al suo valore di default (NULL ovviamente).
L'altro costruttore i dati interni.
Come prima aprossimazione, il tuo iteratore potrebbe assomigliare a:
codice:
class iterator;
friend class iterator;
class iterator {
const List<NODETYPE>* parent;
ListNode<NODETYPE>* elem;
public:
iterator() : parent(NULL), elem(NULL) {}
iterator(
const List<NODETYPE>* p,
ListNode<NODETYPE>* el
) : parent(p), elem(el) {}
};
iterator begin() { return iterator(this,firstptr); }
iterator end() { return iterator(this,NULL); } // sentinella per fine iterazione.
Ti serve anche una funzione privata in List<> che ha il compito di trovare l'elemento successivo. (Lo scopo di parent è appunto poter usare quella funzione nell'operatore di incremento).
P.S.
in insertAtBack deve essere:
codice:
ListNode<NODETYPE> *NewPtr = getNewNode(value) ;
non
codice:
List<NODETYPE> *NewPtr = getNewNode(value) ;