2015-12-15 3 views
0
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; 
    } 

    ... 
} 

Я получаю сообщение об ошибке сказав:C++ Vector Итерация Error

член типа ссылки база 'Агент *' не является структурой или объединением.

Я действительно не понимаю, почему это не работает для навигации по вектору.

+0

Какая ошибка? Что такое «действовать»? Почему вы называете 'act' дважды? – erip

+0

Почему вы используете 'new' в C++? Вместо этого используйте 'make_unique' +' unique_ptr'. –

ответ

5

it указывает на Agent* не Agent. it-> попытается вызвать функцию на указателе, а не на объект. Что вам нужно сделать, это разыменовать итератор, а затем вызвать функцию-член.

(*it)->act(); 
+0

Ahh, что имеет смысл сейчас. Спасибо. –

3
vector<Agent*> agents; 

вектор указателей, вы должны были бы сделать it->act(); в одиночку, если это будет вектор объектов. Но в этом случае вам сначала нужно разыскать it, а затем указатель, который вы получите, сделав это. Указатель и итератор принести в один уровень косвенности каждого, что делает его два:

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

Поскольку тип элемент вектора Agent *, не Agent. Оператор стрелки итератора возвращает ссылку на элемент в векторе, но не имеет функции act (потому что это указатель на Agent, а не Agent). Ваш выбор:

(*it)->act(); 

или переписать весь цикл:

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

пока вы об этом, я бы настоятельно рекомендовал сделать это вектор unique_ptr с. Таким образом, вам не нужно беспокоиться о работе с памятью.

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; 
    } 
} 
+0

Также есть какая-то причина, по которой мой цикл while не работает. Программа просто выполняет действие функции для каждого агента в векторе, затем заканчивается вся программа. –

+0

Должно быть достигнуто 'return 0;' в какой-то момент, отследите его. – LogicStuff

+0

Точно. Призыв к действию должен возвращать false. –

Смежные вопросы