在我班上,我有两个私人成员:
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
的指针。
是否可以检索迭代器内部存储的指针以供在别处使用?
我是否错误地考虑了这个问题?
完成我想要做的事情的正确方法是什么?
答案 0 :(得分:14)
是否可以检索迭代器内部存储的指针以供在别处使用?
当然,只需用*
取消引用迭代器,然后通过&
获取指向对象的指针:
selectedObj = &*i;
在旁注中,您是否记得在循环之前使用selectedObj
初始化NULL
?
答案 1 :(得分:6)
是否可以检索迭代器内部存储的指针以供在别处使用?
是。正如@FredOverflow所说,做到这一点:
selectedObj = &*i;
但是,如果您可以使用C ++ 11的功能,那么您可以使用基于范围的 for
循环来编写更好的语法:
MyObject *selectedObj = NULL;
for (MyObject & obj : objects)
{
if (obj.test())
selectedObj = &obj; //store the address
}
看起来更好?不需要迭代器和编写&*i
之类的语法。还应该注意的是,如果课程MyObject
已经超载operator &
,那么&*i
将无效,因为它会调用operator&
函数,而不是让你对象的地址!如果是这样,那么你编写(MyObject*)&(char&)*i
来获取*i
的地址,或者在C ++ 11中你可以使用std::addressof(*i)
如果你不能使用C ++你可以自己定义11:
template< class T >
T* addressof(T& arg) {
return (T*)&(char&)arg;
}
从此处获取的代码:std::addressof