Comment puis-je stocker des sorts et des objets en utilisant une implémentation std :: vector?

10

Je suis avec un livre de GameInstitute en ce moment, et il me demande de:

Permettez au joueur d'acheter et de porter des potions de guérison et des potions de boule de feu. Vous pouvez ajouter un tableau Item (après avoir défini la classe item) à la classe Player pour les stocker, ou utiliser un vecteur std :: pour les stocker.

Je pense que je voudrais utiliser l' std::vectorimplémentation, car cela semble me dérouter moins que de créer une classe d'élément, mais je ne sais pas comment le faire. Beaucoup de gens m'ont dit que les vecteurs sont d'excellents moyens de stocker des valeurs dynamiques (comme des objets, des armes, etc.), mais je ne l'ai pas vu utilisé.

Vladimir Marenus
la source
3
Vous aurez besoin d'une classe d'objet dans les deux cas. Un tableau d'éléments serait des éléments d' article [INVENTORY_SIZE]; Un std :: vector d'éléments serait std :: vector <Item> items; Un std :: vector n'est qu'un tableau dont la taille peut être modifiée dynamiquement.
API-Beast
1
Pour stocker des objets dans un vecteur, ils doivent être des objets du même type. La façon de le faire est de créer un vecteur d'objet (où Objet est une interface pour tous les objets qui peuvent être ramassés) et des classes pour chacun de vos types d'objets (potion de guérison et potion de boule de feu). Tant que les classes de potions implémentent l'interface Item, vous pouvez les stocker dans le vecteur (bien que les choses devenant plus compliquées, vous souhaitiez peut-être ajouter plus d'interfaces pour des choses comme les consommables, les objets empilables ou simplement les potions elles-mêmes. Mais pour plus de simplicité, faites simplement une classe par objet et l'interface d'objet)
Benjamin Danger Johnson

Réponses:

13

std::vectorest un bon moyen de stocker des éléments "dynamiques" (comme vous les appelez) comme des éléments, mais le véritable avantage du vecteur n'est pas que la chose que vous stockez peut changer, mais que le nombre d'éléments dans le vecteur peut changer sans minimum effort de votre part. Pour illustrer, si vous deviez stocker vos Itemobjets en tant que tableau, vous devrez fixer la taille du tableau lors de la compilation ( Item items[SIZE];), ce qui signifie que vous avez une limite supérieure fixe pour les éléments (entre autres problèmes, qui ne sont pas '' t comme pertinents pour ce sujet spécifique et je vais donc les ignorer).

Vous pouvez également allouer dynamiquement le tableau lors de l'exécution ( Item * items = new Item[SIZE];), ce qui vous permettrait de redimensionner le tableau plus tard en allouant un nouveau stockage, en copiant les éléments et en supprimant l'ancien stockage. Cependant, c'est beaucoup plus de travail pour vous.

Heureusement, c'est ce std::vectorque vous faites - c'est une implémentation de tableau de taille dynamique, essentiellement, et gère la gestion de la mémoire pour augmenter le tableau au-delà de sa capacité actuelle pour vous. C'est certainement l'option que je vous suggère de poursuivre pour l'instant - mais notez que vous voudrez toujours créer une Itemclasse.

C'est très simple à utiliser:

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

La documentation MSDN pour la vectorclasse vaut probablement la peine d'être lue, et si vous n'êtes pas familier avec les modèles - ce qui est vectorutilisé pour lui permettre de stocker "n'importe quoi" - vous devriez également vous brosser les bases. Ce qui m'amène également à un dernier point: bien qu'il semble qu'un vecteur puisse stocker n'importe quoi, il a des contraintes pour ce qui est autorisé et cela lance parfois des débutants. En particulier, le type que vous stockez dans un vecteur doit être copiable, car le vecteur devra par exemple faire une copie des objets lors du redimensionnement de sa mémoire interne. La règle de trois de C ++ est quelque chose à garder à l'esprit ici.


la source
Merci, c'était clair et concis. Je lis la documentation maintenant - Quand j'aurai 15 représentants, je m'assurerai de revenir et de vous voter!
Vladimir Marenus du