Могу ли я получить указатель на текущее значение итератора

в моем классе у меня есть два закрытых члена:

std::list<MyObject> objects;
MyObject *selecteObj;

когда происходит событие, я хотел бы перебрать список и запустить какой-то тест, который даст true только для одного из элементов в списке. Я хочу сохранить указатель на этот элемент для использования в другом месте.

std::list<MyObject>::iterator i;
for (i = objects.begin(); i!=objects.end(); ++i){
    if (i->test())
        selectedObj = i;
}

в другом месте другого метода

if (selectedObj !=null)
    tmpObj->doSomething();

однако это не работает, потому что i - это не указатель, его итератор, хотя вы можете рассматривать его как указатель на MyObject.

можно ли повторить указатель, который итератор хранит внутри для использования в другом месте?

Я думаю об этом неправильно?

каков правильный способ выполнения того, что я пытаюсь сделать?

2 ответов


можно ли повторить указатель, который итератор хранит внутри для использования в другом месте?

конечно, просто разыменовать итератор с * и затем получить указатель на объект через &:

selectedObj = &*i;

на боковой ноте, вы не забыли инициализировать selectedObj С NULL перед циклом?


можно ли повторить указатель, который итератор хранит внутри для использования в другом месте?

да. Как сказал @FredOverflow, сделайте следующее:

selectedObj = &*i;

однако, если вы можете использовать функции C++11, то вы можете наслаждаться написанием лучшего синтаксиса, используя , вместо адреса объекта! Если да, то вы пишете (MyObject*)&(char&)*i получить адрес *i, или в C++11 можно использовать std::addressof(*i) который вы можете определить сами, если вы не можете использовать C++11:

template< class T >
T* addressof(T& arg) {
    return (T*)&(char&)arg;
}

код взят отсюда : std:: addressof