std :: vector実装を使用してスペルとアイテムを保存するにはどうすればよいですか?


10

私は現在GameInstituteの本をフォローしていますが、それは私に次のことを求めています:

プレイヤーがヒーリングポーションとファイアボールのポーションを購入して運ぶことを許可します。アイテムクラスを定義した後、アイテム配列をプレーヤークラスに追加して保存するか、std :: vectorを使用して保存できます。

std::vector実装を使用したいと思います。これは、アイテムクラスを作成するより混乱しないようですが、その方法がわかりません。ベクトルは動的な値(アイテム、武器など)を格納するための優れた方法であると多くの人から聞いたことがありますが、それが使用されるのを見たことはありません。


3
いずれかの方法でItemクラスが必要になります。アイテムの配列は、Item items [INVENTORY_SIZE]になります。アイテムのstd :: vectorはstd :: vector <Item>アイテムになります。std :: vectorは、サイズを動的に変更できる単なる配列です。
API-Beast

1
オブジェクトをベクターに格納するには、同じタイプのオブジェクトでなければなりません。これを行う方法は、アイテムベクトル(アイテムはピックアップ可能なすべてのアイテムのインターフェイスです)と各アイテムタイプ(ヒーリングポーションとファイアボールポーション)のクラスを作成することです。ポーションクラスがItemインターフェースを実装している限り、それらをベクターに格納できます(状況が複雑になると、消耗品、積み重ね可能なアイテム、またはポーション自体などのインターフェースを追加したい場合があります。項目ごとに1つのクラスと項目インターフェイス)
Benjamin Danger Johnson

回答:


13

std::vectorアイテムなどの「動的」なものを(あなたが呼ぶように)格納するための優れた方法ですが、ベクターの本当の利点は、格納しているものが変化することではなく、ベクター内のアイテム数が最小限でも変化することです。あなたの側の努力。たとえば、Itemオブジェクトを配列として保存する場合、コンパイル時に配列のサイズを修正Item items[SIZE];する必要があります()。つまり、アイテムの上限が固定されていることになります(他の問題の中でも特に)この特定の主題に関連するので、スキップします)。

実行時に配列を動的に割り当てることもでき(Item * items = new Item[SIZE];)、新しいストレージを割り当て、アイテムをコピーし、古いストレージを削除することで、後でアレイのサイズを変更できます。ただし、これはあなたがやらなければならない作業がはるかに多くなります。

幸いなことに、std::vectorこれは動的なサイズのアレイ実装であり、基本的に現在の容量を超えてアレイを拡張するためのメモリ管理を処理します。これは間違いなく私が今のところ推奨するオプションですが、Itemクラスを作成する必要があることに注意してください。

使い方はとても簡単です。

// Create an item list and two item objects to add to it.
std::vector<Item> items;
Item fireballPotion("Potion of Fireball");
Item healingPotion("Potion of Healing");

// Add the items:
items.push_back(fireballPotion);
items.push_back(healingPotion);

// operator[] is supported for accessing items.
// This will print "Potion of Fireball" for example:
std::cout << items[0].GetName();

以下のためのMSDNドキュメントvectorクラスはおそらく価値がAのリード、そしてあなたが精通していない場合は、テンプレート -何でvector、それは「何を」保存できるようにするために使用しています-あなたはそこにも基礎をブラッシュアップする必要があります。これも最終的なポイントにつながります。ベクトルは何でも格納できるように見えますが、許可されているものには制約があり、初心者をスローする場合があります。特に、ベクターに格納するタイプはコピー可能でなければなりません。これは、例えば、ベクターが内部ストレージのサイズを変更するときに、オブジェクトのコピーを作成する必要があるためです。C ++の3つ規則は、ここで覚えておくべきものです。


ありがとう、これは明確で簡潔でした。私は今ドキュメントを読んでいます-私が15人の担当者を持っているとき、私は戻ってきてあなたに投票することを確認します!
Vladimir Marenus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.