Cómo hacer referencia a una “clase de propietario” en C ++?
Pregunta
Tengo código que se parece a esto:
template<class T>
class list
{
public:
class iterator;
};
template<class T>
class list::iterator
{
public:
iterator();
protected:
list* lstptr;
};
list<T>::iterator::iterator()
{
//???
}
Quiero hacer el constructor de list::iterator
para hacer punto iterator::lstptr
a la lista que se llama a partir. Es decir:.
list xlst;
xlst::iterator xitr;
//xitr.lstptr = xlst
¿Cómo iba a hacer eso?
Y también, ¿verdad referenciando mi iterador-constructor de la derecha, o debería hacer algo como esto:
template<class T>
class list<T>::iterator
{
public:
list<T>::iterator();
protected:
list* lstptr;
};
Solución
Puede pasar la lista para el constructor de iterador:
list xlst;
list::iterator xitr(xlst);
O, usted podría hacer una función de iterador de fábrica:
list xlst;
list::iterator xitr = xlst.create_iter();
En el caso de la función de la fábrica, la función create_iter()
puede utilizar this
para referirse a la lista de cerramiento.
Otros consejos
Dado que no es necesario cambiar (vuelva a asentar) el puntero y no hay necesidad de que el valor NULL, me gustaría utilizar en su lugar una referencia. También se puede utilizar una lista de inicialización cuando se asigna la variable miembro (y que si está utilizando una referencia).
template<class T>
class list::iterator
{
public:
iterator( list& parent ) : lstptr( parent ){}
protected:
list& lstptr;
};
Y como se mencionó antes: usar un método de fábrica dentro de la clase lista para construir objetos de tipo de lista :: iterador
.