3

下面的代码:

#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'?谢谢。

4

4 回答 4

6

你要

(*it)->printHello();

因为*it返回存储的指针A*,只有这样你才能应用->

于 2013-09-27T19:58:22.710 回答
2

只需更改以下行

it->printHello(); 

(*it)->printHello(); 

operator*() 可以访问容器中包含的数据,在您的情况下,它是一个指针。当不在容器中使用指针时,仅使用 operator->() 也可以。

于 2013-09-27T20:08:16.700 回答
1

取消引用it将为您提供指向 A 的指针,然后您需要访问方法或数据成员。

所以使用:

(*it)->printHello();

于 2013-09-27T20:01:45.487 回答
1

让我扩展丹尼尔的答案。

当您在变量前面加上星号时,它被称为“取消引用”。以这种方式使用,星号是一个“取消引用运算符”。简单地说(我不知道你的理解水平是多少),*pMyPointer就像 pMyPointer 指向的对象一样。如果它是指向指针的指针,那么结果就是指针。

例如,当您在指针上调用方法时,您使用 Into Operator ->

这两个经常做同样的事情:

pMyPointer->MyFunction();

(*pMyPointer).MyFunction();

在 C++ 迭代器的情况下,取消引用运算符被覆盖以返回存储在其位置的对象。在这种情况下,存储在它的位置的是一个指针,所以你仍然必须使用->,除非你把另一个解引用操作符放在那里。

于 2013-09-27T20:08:07.747 回答