C ++向量迭代错误

时间:2015-12-15 18:51:04

标签: c++ pointers vector iteration

monster* monster1 = new monster("Frankenstein", "The Ugly One", BackYard);
Player* player1 = new Player("Corey", "The Chosen one", Atrium);
Player* player2 = new Player("Darth Vader", "The Evil One", Atrium);
vector<Agent*> agents;
agents.push_back(monster1);
agents.push_back(player1);
agents.push_back(player2);

while (true)
{
    vector<Agent*>::iterator it;

    for (it = agents.begin(); it < agents.end(); it++) {
        it->act();                                            // Error here
        if (it->act() == false)                               // Error here
            return 0;
    }

    ...
}

我收到错误说:

  

会员参考基础类型&#39;代理*&#39;不是结构或联盟。

我真的不明白为什么这对导航矢量没有用。

3 个答案:

答案 0 :(得分:5)

it指向Agent*而不是Agentit->将尝试在指针上调用函数而不是对象。您需要做的是取消引用迭代器,然后调用成员函数。

(*it)->act();   

答案 1 :(得分:3)

vector<Agent*> agents;

是一个指针向量,如果它是一个对象向量,你必须单独做it->act();。但在这种情况下,首先需要取消引用it,然后通过这样做来获取指针。指针和迭代器各引入一个间接级别,这使它成为两个:

(*it)->act();
(**it).act(); // equivalent

答案 2 :(得分:2)

因为向量的元素类型是Agent *,而不是Agent。迭代器箭头操作符返回对向量中元素的引用 - 但它没有act函数(因为它是指向Agent而不是Agent的指针})。您的选择是:

    (*it)->act();

或重写整个循环:

    for (auto pAgents : agents)
    {
        pAgents->act();
    }

当你谈到它时,我强烈建议把它变成unique_ptr s的向量。这样你就不必担心内存处理。

vector<std::unique_ptr<Agent>> agents;
agents.push_back( std::make_unique<Monster>("Frankenstein", "The Ugly One", BackYard));
agents.push_back( std::make_unique<Player>("Corey", "The Chosen one", Atrium) );
agents.push_back( std::make_unique<Player>("Darth Vader", "The Evil One", Atrium) );

while (true)
{

    for (auto pAgent : agents){
        pAgent->act();
        if (!pAgent->act())
            return 0;
    }
}