Wie kann ich Zauber und Gegenstände mit einer std :: vector-Implementierung speichern?

10

Ich verfolge gerade ein Buch von GameInstitute und es fordert mich auf:

Erlaube dem Spieler, Heiltränke und Feuerballtränke zu kaufen und zu tragen. Sie können der Player-Klasse ein Item-Array hinzufügen (nachdem Sie die Item-Klasse definiert haben), um sie zu speichern, oder einen std :: -Vektor verwenden, um sie zu speichern.

Ich denke, ich würde die std::vectorImplementierung gerne verwenden , da mich das weniger verwirrt als das Erstellen einer Elementklasse, aber ich bin mir nicht sicher, wie ich das tun soll. Ich habe von vielen Leuten gehört, dass Vektoren großartige Möglichkeiten zum Speichern dynamischer Werte (wie Gegenstände, Waffen usw.) sind, aber ich habe nicht gesehen, dass sie verwendet werden.

Vladimir Marenus
quelle
3
In beiden Fällen benötigen Sie eine Item-Klasse. Ein Array von Elementen wäre Element Elemente [INVENTORY_SIZE]; Ein std :: vector von Elementen wäre std :: vector <Item> items; Ein std :: vector ist nur ein Array, dessen Größe dynamisch geändert werden kann.
API-Beast
1
Um Objekte in einem Vektor zu speichern, müssen sie Objekte desselben Typs sein. Der Weg, dies zu tun, besteht darin, einen Gegenstandsvektor (wobei Gegenstand eine Schnittstelle für alle Gegenstände ist, die aufgenommen werden können) und Klassen für jeden Ihrer Gegenstandsarten (Heiltrank und Feuerballtrank) zu erstellen. Solange die Trankklassen die Item-Schnittstelle implementieren, können Sie sie im Vektor speichern (obwohl Sie, wenn die Dinge komplizierter werden, möglicherweise mehr Schnittstellen für Dinge wie Verbrauchsartikel, stapelbare Gegenstände oder nur Tränke selbst hinzufügen möchten. Aber der Einfachheit halber machen Sie es einfach eine Klasse pro Gegenstand und die Gegenstandsschnittstelle)
Benjamin Danger Johnson

Antworten:

13

std::vectorist eine gute Möglichkeit, "dynamische" (wie Sie sie nennen) Dinge wie Elemente zu speichern, aber der wahre Vorteil des Vektors besteht nicht darin, dass sich das, was Sie speichern, ändern kann, sondern dass sich die Anzahl der Elemente im Vektor ohne Minimum ändern kann Anstrengung von Ihrer Seite. Wenn Sie Ihre ItemObjekte als Array speichern möchten, müssen Sie zur Kompilierungszeit die Größe des Arrays festlegen ( Item items[SIZE];). Dies bedeutet, dass Sie eine feste Obergrenze für Elemente haben (unter anderem Probleme, die nicht auftreten). t als relevant für dieses spezielle Thema und so werde ich sie überspringen).

Sie können das Array auch zur Laufzeit ( Item * items = new Item[SIZE];) dynamisch zuweisen, um die Größe des Arrays später zu ändern, indem Sie neuen Speicher zuweisen , die Elemente kopieren und den alten Speicher löschen. Dies ist jedoch viel mehr Arbeit für Sie.

Glücklicherweise std::vectorbedeutet dies für Sie Folgendes: Es handelt sich im Wesentlichen um eine Array-Implementierung mit dynamischer Größe, die die Speicherverwaltung übernimmt, um das Array über seine derzeitige Kapazität hinaus zu vergrößern. Es ist definitiv die Option, die Sie vorerst verfolgen sollten - aber beachten Sie, dass Sie immer noch eine ItemKlasse erstellen möchten .

Es ist sehr einfach zu bedienen:

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

Die MSDN-Dokumentation für die vectorKlasse ist wahrscheinlich eine Lektüre wert. Wenn Sie nicht mit Vorlagen vertraut sind, mit denen vector"alles" gespeichert werden kann, sollten Sie auch dort die Grundlagen auffrischen. Was mich auch zu einem letzten Punkt führt: Während es so aussieht, als ob ein Vektor alles speichern kann, gibt es Einschränkungen für das, was darin erlaubt ist, und diese werfen manchmal Anfänger. Insbesondere muss der Typ, den Sie in einem Vektor speichern, kopierbar sein, da der Vektor beispielsweise beim Ändern der Größe seines internen Speichers eine Kopie der Objekte erstellen muss. C ++ 's Regel von drei ist hier etwas im Auge zu behalten.


quelle
Vielen Dank, das war klar und prägnant. Ich lese gerade die Dokumentation durch. Wenn ich 15 Wiederholungen habe, werde ich auf jeden Fall zurückkommen und dich abstimmen!
Vladimir Marenus