Wie man eine „Eigentümer-Klasse“ in C ++ verweisen?
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;
};
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
.