Как сослаться на «класс владельца» в C ++? - PullRequest
1 голос
/ 18 мая 2009

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

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 указывал на список, из которого он вызывается. I.e.:

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

Как бы я это сделал?

А также, правильно ли я ссылаюсь на свой конструктор итератора, или я должен сделать что-то вроде этого:

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

Ответы [ 2 ]

3 голосов
/ 18 мая 2009

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

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

Или вы можете создать фабричную функцию итератора:

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

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

0 голосов
/ 18 мая 2009

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

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

protected:
    list& lstptr;
};

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

...