通过指针向量迭代

时间:2014-04-27 02:58:26

标签: c++ pointers object vector

我正试图通过玩家手牌迭代。

Player.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()方法只是:

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();
}

我查看了各种资源,并且针对类似问题提出的所有建议都没有对我有用。谢谢你的帮助!

3 个答案:

答案 0 :(得分:29)

试试这个:

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

*运算符为您提供迭代器引用的项,在您的情况下是一个指针。然后使用->取消引用该指针。

答案 1 :(得分:2)

您必须取消引用迭代器才能访问指针:

#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()。

(顺便说一句,总是有助于提供一个可重复的最小例子,就像我刚问你问的那样。)

答案 2 :(得分:1)

通过iter取消引用迭代器 - &gt;给出一个指向Card类型对象的指针,你必须写(* iter) - &gt; display_card();