指针列表c ++

时间:2013-09-27 19:56:59

标签: c++ list pointers iterator std

以下代码:

#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 个答案:

答案 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;()也可以。