Доброго дня.
Пишу свой iterator (усеченная версия):
class iterator
{
NODE* _pos;
int _val;
iterator(NODE* pos) : _pos(pos) {}
int operator *() { return _pos->_val; }
};
Как мне получить доступ к _pos, если *it показывает только _val. Т.е.где-то в тексте:
iterator it = myList.begin(); // iterator my::begin() { return iterator(_my_node); }
...
_my_node = it->_pos; // НЕ ПОЛУЧАЕТСЯ !
Спасибо.
Здравствуйте, Su34, Вы писали:
S>Доброго дня.
S>Пишу свой iterator (усеченная версия):
S>class iterator
S>{
S> NODE* _pos;
S> int _val;
S> iterator(NODE* pos) : _pos(pos) {}
S> int operator *() { return _pos->_val; }
S>};
S>Как мне получить доступ к _pos, если *it показывает только _val. Т.е.где-то в тексте:
S>S>iterator it = myList.begin(); // iterator my::begin() { return iterator(_my_node); }
S>...
S>_my_node = it->_pos; // НЕ ПОЛУЧАЕТСЯ !
S>
Гм. Ну либо
_my_node = it._pos;
Либо operator *() должен возвращать сцылку на какую-то структуру, которая содержит всё, к чему надо добраться.
struct IteratorGiblets
{
NODE* _pos;
int _val;
};
class iterator
{
IteratorGiblets myGiblets;
... всё остальное
}
Перегрузки по возвращаемому значению нет, поэтому два оператора создать не получится.
Upd. Чтобы не было путаницы в операторах, стоит заглянуть сюда:
https://en.cppreference.com/w/cpp/language/operator_member_access
Поясню, что бы лучше понять то, что я хочу.
S>Пишу свой iterator (усеченная версия):
S>class iterator
S>{
S> NODE* _pos;
S> int _val;
S> iterator(NODE* pos) : _pos(pos) {}
S> int operator *() { return _pos->_val; }
S>};
Есть класс односвязного списка (не спрашивайте зачем велосипед)
class oneList {
struct node {
int _val;
node* _next;
}
node* _root;
iterator begin() { return iterator(_root); }
...
insert(iterator ins, int val) {
// чтобы вставить новый элемент мне необходимо ins->_pos !!!
}
};
Спасибо.
Здравствуйте, Su34, Вы писали:
S>Есть класс односвязного списка (не спрашивайте зачем велосипед)
S>class oneList {
S> struct node {
S> int _val;
S> node* _next;
S> }
S> node* _root;
S> iterator begin() { return iterator(_root); }
S> ...
S> insert(iterator ins, int val) {
S> // чтобы вставить новый элемент мне необходимо ins->_pos !!!
S> }
S>};
Тогда oneList должен быть friend'ом итератора и может обращаться напрямую к мемберам. Зачем через оператор?
Здравствуйте, Su34, Вы писали:
S>Поясню, что бы лучше понять то, что я хочу.
S>>Пишу свой iterator (усеченная версия):
S>>class iterator
S>>{
S>> NODE* _pos;
S>> int _val;
S>> iterator(NODE* pos) : _pos(pos) {}
S>> int operator *() { return _pos->_val; }
S>>};
Что ещё за iterator::_val значение? Выглядит подозрительно.
S>Есть класс односвязного списка (не спрашивайте зачем велосипед)
S>class oneList {
S> struct node {
S> int _val;
S> node* _next;
S> }
S> node* _root;
S> iterator begin() { return iterator(_root); }
S> ...
S> insert(iterator ins, int val) {
S> // чтобы вставить новый элемент мне необходимо ins->_pos !!!
S> }
S>};
S>Спасибо.
Есть разные способы:
1) iterator объявляет себя другом oneList, тогда ins._pos доступен из oneList
2) добавляете в iterator метод GetPos(), который возвращает _pos, тогда ins.GetPos() вернёт его.
3) добавляете оператор сравнения iterator'а и NODE*, после чего проходите по всему списку и сравнением находите нужный.
4) можно ещё всякого придумать.
Мне интересно: метод oneList::insert должен добавлять элемент до или после элемента, на который он указывает?
Здравствуйте, Su34, Вы писали:
S>Доброго дня.
S>Пишу свой iterator (усеченная версия):
S>class iterator
S>{
S> NODE* _pos;
S> int _val;
S> iterator(NODE* pos) : _pos(pos) {}
S> int operator *() { return _pos->_val; }
S>};
S>Как мне получить доступ к _pos, если *it показывает только _val. Т.е.где-то в тексте:
S>S>iterator it = myList.begin(); // iterator my::begin() { return iterator(_my_node); }
S>...
S>_my_node = it->_pos; // НЕ ПОЛУЧАЕТСЯ !
S>
S>Спасибо.
А так?
class iterator
{
public:
NODE* _pos;
int _val;
iterator(NODE* pos) : _pos(pos) {}
int operator *() { return _pos->_val; }
};