vector<Object*>::iterator iter;
for(iter = vec.begin(); iter != vec.end(); ++iter)
{
(*iter)->methodA();
}
我知道( iter) - &gt; methodA();相当于((* iter))。methodA();
但我不明白为什么我们需要第二个*。不应该指向iter的值(指针值或Object实例的地址),它是一个地址(iter指向自身的地址)。指针非常混乱。
答案 0 :(得分:3)
*iter
为您提供了Object*
。这是一个指针,因此您需要使用->
或更多*
来通过它调用方法。它与
Object* p = *iter;
p->methodA();
(*p).methodA();
至于你的问题标题,(*iter).methodA()
不应该编译。
答案 1 :(得分:1)
迭代器是一种抽象。这是一个概念,任何行为类似于迭代器的都是迭代器。这就是为什么你可以在这里声明指针是一个迭代器。
对于 It 类型作为迭代器,除了其他要求之外,还必须满足以下类型的对象 i :
Expression Return Precondition
*i reference i is dereferenceable [2]
++i It&
所以假设迭代器
vector<Object*>::iterator iter;
然后:
(*iter) -> methodA();
^^^^^^^ ^
&(Object*) dereference pointer and call methodA on the object
pointed to by pointer
(*iter) . methodA();
^^^^^^^ ^
&(Object*) call methodA on the pointer? error: request for member ‘methodA’ in
‘it.__gnu_cxx::__normal_iterator<_Iterator, _Container>::operator*
[with _Iterator = Object**, _Container = std::vector<Object*,
std::allocator<Object*> >]()’, which is of non-class type ‘Object*’
make: *** [main.o] Error 1