以下代码:
#include <iostream>
#include <list>
class A
{
public:
void printHello(){std::cout << "hello";}
};
int main(int argc, char *argv)
{
std::list<A*> lista;
lista.push_back(new A());
for(std::list<A*>::iterator it=lista.begin();it!=lista.end();++it)
{
//how to get to printHello method?
//it doesn't work
it->printHello();
}
return 0;
}
此代码不起作用。我的问题是如何通过迭代器获取方法'printHello'呢?感谢。
答案 0 :(得分:5)
你想要
(*it)->printHello();
,*it
返回存储的指针A*
,然后才能应用->
。
答案 1 :(得分:1)
取消引用it
将为您提供指向A的指针,然后您需要访问方法或数据成员。
所以使用:
(*it)->printHello();
答案 2 :(得分:1)
让我扩展丹尼尔的答案。
当您在变量前粘贴星号时,它称为“解除引用”。使用这种方式,Asterisk是一个'解除引用运算符'。把它称为noob-ishly(我不知道你有什么程度的理解),*pMyPointer
就像是pMyPointer所指向的对象。如果它是指向指针的指针,则结果只是指针。
例如,当您在指针上调用方法时,使用Into Operator ->
。
这两个经常做同样的事情:
pMyPointer->MyFunction();
(*pMyPointer).MyFunction();
对于C ++迭代器,将重写Dereference Operator以返回存储在其位置的对象。在这种情况下,存储在其位置的是指针,因此您仍然必须使用->
,除非您在那里粘贴另一个解除引用运算符。
答案 3 :(得分:1)
只需更改以下行
it->printHello();
到
(*it)->printHello();
operator *()允许访问容器的包含数据,在您的情况下是指针。当不在容器中使用指针时,只使用operator-&gt;()也可以。