Могу ли я получить указатель на текущее значение итератора
в моем классе у меня есть два закрытых члена:
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