Question Itérer à travers un vecteur de pointeurs


J'essaie d'itérer à travers une main de cartes de joueurs.

Player.cpp 

vector<Card*>::iterator iter;
    for(iter = current_cards.begin(); iter != current_cards.end(); iter++) {
        cout << iter->display_card() << endl;
    }

Le iter dans

cout << iter->display_card() << endl;

présente actuellement l'erreur ": l'expression doit avoir un type de pointeur sur classe".

De même, current_cards est déclaré avec:

vector<Card*>current_cards;

De plus, la méthode display_card () est simplement:

Card.cpp

string Card::display_card(){
    stringstream s_card_details;
    s_card_details << "Colour: " << card_colour << "\n";
    s_card_details << "Type: " << card_type << "\n";

    return s_card_details.str();
}

J'ai examiné diverses ressources et tout ce qui a été suggéré pour des types de problèmes similaires n'a pas fonctionné pour moi. Merci pour toute aide!


10
2018-04-27 02:58


origine


Réponses:


Essaye ça:

cout << (*iter)->display_card() << endl;

le * L'opérateur vous donne l'élément référencé par l'itérateur, qui dans votre cas est un pointeur. Ensuite, vous utilisez le -> de déréférencer ce pointeur.


25
2018-04-27 03:02



Vous devez déréférencer l'itérateur pour accéder au pointeur:

#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;
  }
}

Une autre observation est la iter++ que vous devriez éviter en profitant de ++iter (voir https://stackoverflow.com/a/24904/2077394). Selon le conteneur, vous pouvez également éviter d'appeler end () à chaque itération.

(Par ailleurs, il est toujours utile de fournir un exemple reproductible minimal, comme je viens d'écrire lorsque vous posez une question.)


2
2018-04-27 03:05



La référence à l'itérateur par iter-> donne un pointeur sur un objet de type Card, vous devez écrire (* iter) -> display_card ();


1
2018-04-27 03:05