Frage

Ich habe Code, der wie folgt aussieht:

template<class T>
class list
{
public:
    class iterator;
};

template<class T>
class list::iterator
{
public:
    iterator();
protected:
    list* lstptr;
};

list<T>::iterator::iterator()
{
    //???
}

Ich möchte den Konstruktor von list::iterator machen iterator::lstptr Punkt auf der Liste, um es aus aufgerufen wird. Das heißt:.

list xlst;
xlst::iterator xitr;
//xitr.lstptr = xlst

Wie würde ich das tun?

Und auch, bin ich mein Iterator-Konstruktor Recht verweisen, oder sollte ich so etwas tun:

template<class T>
class list<T>::iterator
{
public:
    list<T>::iterator();
protected:
    list* lstptr;
};
War es hilfreich?

Lösung

Sie können die Liste der an den Konstruktor Iterator übergeben:

list xlst;
list::iterator xitr(xlst);

Oder könnten Sie eine Iterator Fabrik Funktion machen:

list xlst;
list::iterator xitr = xlst.create_iter();

In der Fabrik Funktion Fall kann die create_iter() Funktion this verwenden, um Ende der Liste zu finden.

Andere Tipps

Da Sie nicht ändern müssen (neu einsetzen) den Zeiger und es gibt keine Notwendigkeit für den NULL-Wert, würde ich stattdessen eine Referenz verwenden. Sie können auch eine Initialisiererliste verwenden, wenn die Elementvariable zuweisen (und müssen, wenn Sie eine Referenz verwenden).

template<class T>
class list::iterator
{
public:
    iterator( list& parent ) : lstptr( parent ){}

protected:
    list& lstptr;
};

Und wie schon erwähnt: eine Factory-Methode in der Liste Klasse verwenden, um Objekte des Typs Liste zu konstruieren :: iterator

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top