web-dev-qa-db-ja.com

ポインターのベクトルを反復する

カードのプレイヤーズハンドを反復処理しようとしています。

Player.cpp

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

イテイン

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

私はさまざまなリソースを調べましたが、同様のタイプの問題について提案されているすべてが私にとってうまくいきませんでした。助けてくれてありがとう!

16
Red Shift

これを試して:

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

*演算子は、イテレーターによって参照される項目を提供します。これは、ユーザーの場合はポインターです。次に、->は、そのポインターを逆参照します。

34
Reto Koradi

ポインタにアクセスするには、イテレータを逆参照する必要があります。

#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++利益を得るために避けるべき++iterhttps://stackoverflow.com/a/24904/2077394 を参照)。コンテナによっては、繰り返しごとにend()を呼び出さないようにすることもできます。

(ちなみに、あなたが質問したときに私が書いたばかりのような最小限の再現可能な例を提供することは常に役立ちます。)

3
Joky

Iter->によってイテレータを逆参照すると、Cardタイプのオブジェクトへのポインタが与えられ、(* iter)-> display_card();と記述する必要があります。

1
Rakib