"Расширить" operator *()
От: Su34 Россия  
Дата: 23.12.22 06:47
Оценка:
Доброго дня.
Пишу свой 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;    // НЕ ПОЛУЧАЕТСЯ !

Спасибо.
Re: "Расширить" operator *()
От: Stanislav V. Zudin Россия  
Дата: 23.12.22 07:01
Оценка:
Здравствуйте, 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
_____________________
С уважением,
Stanislav V. Zudin
Отредактировано 23.12.2022 7:04 Stanislav V. Zudin . Предыдущая версия .
Re: "Расширить" operator *()
От: Su34 Россия  
Дата: 23.12.22 07:37
Оценка:
Поясню, что бы лучше понять то, что я хочу.
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 !!!
    }
};

Спасибо.
Re[2]: "Расширить" operator *()
От: Stanislav V. Zudin Россия  
Дата: 23.12.22 07:41
Оценка:
Здравствуйте, 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'ом итератора и может обращаться напрямую к мемберам. Зачем через оператор?
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: "Расширить" operator *()
От: B0FEE664  
Дата: 23.12.22 16:03
Оценка:
Здравствуйте, 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 должен добавлять элемент до или после элемента, на который он указывает?
И каждый день — без права на ошибку...
Re: "Расширить" operator *()
От: Sm0ke Россия ksi
Дата: 24.12.22 04:26
Оценка:
Здравствуйте, 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; } 
};
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.