Итерация по вектору указателей

Я пытаюсь повторить через игроков руку карт.

плеер.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 ();