Вектор не является указателем (и не действует как единое целое), и, следовательно, не определен operator->
.Использование вектора Enemy
s аналогично использованию их массива с оператором индекса:
std::vector<Enemy> enemies;
enemies.push_back(Enemy());
enemies[0].update();
Причина, по которой вы можете использовать operator->
для массивов, заключается в том, что массивы преобразуются в указатели и, таким образом,1007 *
Enemy enemies[5];
enemies->update();
эквивалентно
Enemy enemies[5];
(*enemies).update();
, что, в свою очередь, эквивалентно
Enemy enemies[5];
enemies[0].update();
Однако то, что это возможно, не означает, что это хорошая идея: людям будет гораздо меньше проблем с пониманием вашего кода, если вы напишите enemies[0].update()
вместо enemies->update()
.
Если вы хотите пройти через vector<Enemy>
, как вы могли бы с указателем на массив, вы должныdo
for (std::vector<Enemy>::iterator it = enemies.begin(); it < enemies.end(); ++it) {
it->update();
}
Если вы используете C ++ 11 и ленивы, вы можете написать auto
вместо std::vector<Enemy>::iterator
, и компилятор определит тип для вас.(Вы также можете сохранить значение enemies.end()
вне цикла, чтобы не вызывать функцию на каждой итерации, но в любом случае это можно оптимизировать).