1

カスタムクラスのリストを印刷することに関して誰かが私を助けることができるかどうか疑問に思っていました(コンテナを初めて使用する)。

現在、次のように宣言された変数があります。

std::list<Item> inventory;

player と呼ばれるクラス内。

これで、クラス (プレーヤー) 内に という関数を作成しましたvoid printInventory();

だから私の質問は、そのリストにあるものをどのように印刷するのかということです。

Itemのクラスには 3 つの変数が含まれています。

std::string name; 
int damage;
int value;

これらの変数を出力する機能もありますvoid itemDetails();

どんな助けでも大歓迎です。

編集:

提供された回答のおかげで問題が解決したことはわかっています。ここで私がしたことは次のとおりです。

項目クラスの出力演算子をオーバーロードしました:

    ostream& operator<<(ostream& os, const Item& item)
    {
            if (item.getTypeInt() == 0)
            {
                    os << "Name: " << item.getName() << endl
                    << "Type: " << item.getTypeString() << endl
                    << "Damage: " << item.getDamage()<< endl
                    << "Value: " << item.getValue() << endl;
            }
            else
            {
            os << "Name: " << item.getName() << endl
            << "Type: " << item.getTypeString() << endl
            << "HP: " << item.getHP()<< endl
            << "Value: " << item.getValue() << endl;
    }

    return os;
    }

次に、回答の1つを使用しましたが、別の変数を宣言しないように変更しました。

    void Player::printInventory()
    {   
        for(std::list<Item>::iterator it = inventory.begin(); it!= inventory.end(); ++it)
        {
                cout << *it;
        }

        cout <<"Inventroy Printed!!"<<endl;
    }
4

5 に答える 5

3

とをオーバーロードする必要std::ostream& operator<<があります。これにより、データを stdout 以外のストリームに書き込むことができます。次に例を示します。Itemplayer

std::ostream& ooprator<<(std::ostream& os, const Item& item)
{
  return os << "Item {" << item.name << " " << item.damage << " " << item.value << "}";
}

これにより、次のことが可能になります

Item i;
std::cout << i << "\n";

次に、同様の演算子 for を実装playerし、リストをループして各項目を出力します。

std::ostream& ooprator<<(std::ostream& os, const player& p)
  for (const auto& i : p.inventory) os << i << " "
  return os;
}
于 2012-11-20T13:24:21.183 に答える
1

にアイテムのリストが既にありますinventory。それを繰り返して呼び出しますitemDetails

void printInventory()
{
  for(std::list<Item>::iterator it = inventory.begin(); it!= inventory.end(); ++it)
  {
    Item item = *it;
    item.itemDetails();
  }
}

これは仕事をします。

于 2012-11-20T13:28:38.310 に答える
1

std::for_eachと合わせてご覧くださいstd::mem_funMSDN には良い例があります。または、メンバー関数を直接呼び出して、いつでも独自のループを展開できます。

私は手元にコンパイラを持っていませんが、次のような方法でうまくいくはずです:

std::for_each(inventory.begin(), inventory.end(), std::mem_fun<Item>(&Item::printInventory));
于 2012-11-20T13:22:10.303 に答える
0

シンプルなforループです

for (std::list<Item>::iterator i = inventory.begin(); i != inventory.end(); ++i)
    i->itemDetails();

他にも方法はありますが、私ならこうします。

itemDetailsメソッドの名前としてはあまり適切ではありません。たぶんprintDetails

于 2012-11-20T13:23:35.873 に答える
0

演算子をオーバーロードして、<<標準出力を介してアイテムを出力できるようにすることができます。ここでいくつかの例を見つけることができます。

于 2012-11-20T13:24:00.080 に答える