Как ссылаться на "класс владельца" на С++?
У меня есть код, который выглядит так:
template<class T>
class list
{
public:
class iterator;
};
template<class T>
class list::iterator
{
public:
iterator();
protected:
list* lstptr;
};
list<T>::iterator::iterator()
{
//???
}
Я хочу сделать конструктор list::iterator
, чтобы сделать iterator::lstptr
указателем на список, из которого он вызвал. То есть:.
list xlst;
xlst::iterator xitr;
//xitr.lstptr = xlst
Как мне это сделать?
И также я ссылаюсь на свой конструктор-итератор-конструктор, или мне нужно сделать что-то вроде этого:
template<class T>
class list<T>::iterator
{
public:
list<T>::iterator();
protected:
list* lstptr;
};
Вы можете передать список конструктору итератора:
list xlst;
list::iterator xitr(xlst);
Или вы можете сделать функцию iterator factory:
list xlst;
list::iterator xitr = xlst.create_iter();
В функциональном случае factory функция create_iter()
может использовать this
для обозначения прилагаемого списка.
Поскольку вам не нужно менять (переустанавливать) указатель и нет необходимости в значении NULL, вместо этого я бы использовал ссылку. Кроме того, вы можете использовать список инициализаторов при назначении переменной-члену (и должны, если вы используете ссылку).
template<class T>
class list::iterator
{
public:
iterator( list& parent ) : lstptr( parent ){}
protected:
list& lstptr;
};
И как уже упоминалось ранее: используйте метод factory внутри класса списка для построения объектов типа list:: iterator.