Итерация по вектору указателей
Я пытаюсь повторить через игроков руку карт.
плеер.cpp
vector<Card*>::iterator iter;
for(iter = current_cards.begin(); iter != current_cards.end(); iter++) {
cout << iter->display_card() << endl;
}
iter в
cout << iter->display_card() << endl;
в настоящее время появляется "ошибка: выражение должно иметь тип указателя на класс".
аналогично, current_cards объявляется с помощью:
vector<Card*>current_cards;
кроме того, метод display_card () просто:
3 ответов
попробуйте это:
cout << (*iter)->display_card() << endl;
на *
оператор дает вам пункт, на который ссылается итератор, который в вашем случае является указателем. Затем вы используете ->
разыменовать этот указатель.
вы должны разыменовать итератор для доступа к указателю:
#include <vector>
#include <iostream>
class Card {
public:
std::string display_card();
};
int main() {
std::vector<Card*>current_cards;
std::vector<Card*>::iterator iter, end;
for(iter = current_cards.begin(), end = current_cards.end() ; iter != end; ++iter) {
std::cout << (*iter)->display_card() << std::endl;
}
}
другое наблюдение-это iter++
которого вы должны избегать в прибыли ++iter
(см. https://stackoverflow.com/a/24904/2077394).
В зависимости от контейнера вы также можете избежать вызова end() на каждой итерации.
(кстати, это всегда помогает обеспечить минимальный воспроизводимый пример, как я только что написал, когда вы задаете вопрос.)
отмена ссылки на итератор с помощью iter - > дает указатель на объект типа Card, вы должны написать (*iter) - >display_card ();