2009-05-17 4 views
1

У меня есть код, который выглядит следующим образом:Как ссылаться на «класс владельца» на C++?

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

Вы пробовали код, закомментированный во втором блоке? Я не знаю C++ (только C), и это похоже на то, что я буду делать. – hhafez

+0

Ваша последняя версия итератора верна, если вы меняете ctor из списка :: iterator(); -> iterator(); cheers –

ответ

3

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

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

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

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

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

+0

Да, я собирался сделать это, пока я не перейду, я должен уметь сделать итератор равным классу вызова. Затем я проведу ваш ответ и изменил, что я бы назвал iterator «list :: iterator», а не «xlst :: iterator». Моя цель состояла в том, чтобы воссоздать некоторые аспекты «вектора». – 2009-05-17 21:58:42

0

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

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

protected: 
    list& lstptr; 
}; 

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

Смежные вопросы