Как ссылаться на "класс владельца" на С++?

61
5

У меня есть код, который выглядит так:


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;
};

спросил(а) 2009-05-18T00:50:00+04:00 11 лет, 9 месяцев назад
1
Решение
86

Вы можете передать список конструктору итератора:


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

Или вы можете сделать функцию iterator factory:

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

В функциональном случае factory функция create_iter() может использовать this для обозначения прилагаемого списка.

ответил(а) 2009-05-18T00:54:00+04:00 11 лет, 9 месяцев назад
43

Поскольку вам не нужно менять (переустанавливать) указатель и нет необходимости в значении NULL, вместо этого я бы использовал ссылку. Кроме того, вы можете использовать список инициализаторов при назначении переменной-члену (и должны, если вы используете ссылку).


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

protected:
list& lstptr;
};

И как уже упоминалось ранее: используйте метод factory внутри класса списка для построения объектов типа list:: iterator.

ответил(а) 2009-05-18T20:20:00+04:00 11 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема