¿Cómo puedo almacenar hechizos y elementos usando una implementación std :: vector?

10

Estoy siguiendo un libro de GameInstitute en este momento y me pide que:

Permita que el jugador compre y lleve pociones curativas y pociones de bola de fuego. Puede agregar una matriz de elementos (después de definir la clase de elementos) a la clase Player para almacenarlos, o usar un std :: vector para almacenarlos.

Creo que me gustaría usar la std::vectorimplementación, porque eso parece confundirme menos que hacer una clase de elemento, pero no estoy seguro de cómo hacerlo. Muchas personas me han dicho que los vectores son excelentes formas de almacenar valores dinámicos (como elementos, armas, etc.), pero no lo he visto utilizado.

Vladimir Marenus
fuente
3
Necesitará una clase de artículo de cualquier manera. Una matriz de elementos serían elementos de elemento [INVENTORY_SIZE]; Un std :: vector de elementos sería std :: vector <Item> items; Un std :: vector es solo una matriz cuyo tamaño se puede cambiar dinámicamente.
API-Beast
1
Para almacenar objetos en un vector, deben ser objetos del mismo tipo. La forma de hacerlo es crear un vector de Objeto (donde el Objeto es una interfaz para todos los objetos que se pueden recoger) y clases para cada uno de sus tipos de objeto (poción de curación y poción de bola de fuego). Siempre y cuando las clases de pociones implementen la interfaz Item, puede almacenarlas en el vector (aunque a medida que las cosas se vuelven más complicadas, es posible que desee agregar más interfaces para cosas como artículos consumibles, elementos apilables o solo pociones). una clase por elemento y la interfaz del elemento)
Benjamin Danger Johnson

Respuestas:

13

std::vectores una buena manera de almacenar cosas "dinámicas" (como las llama) como elementos, pero el beneficio real del vector no es que lo que está almacenando puede cambiar, sino que la cantidad de elementos en el vector puede cambiar sin un mínimo esfuerzo de tu parte. Para ilustrar, si tuviera que almacenar sus Itemobjetos como una matriz, tendría que fijar el tamaño de la matriz en tiempo de compilación ( Item items[SIZE];), lo que significa que tiene un límite superior fijo en los elementos (entre otros problemas, que no son t como relevante para este tema específico y, por lo tanto, los omitiré).

También podría asignar dinámicamente la matriz en tiempo de ejecución ( Item * items = new Item[SIZE];), lo que le permitiría cambiar el tamaño de la matriz más tarde al asignar un nuevo almacenamiento, copiar los elementos y eliminar el almacenamiento anterior. Esto, sin embargo, es mucho más trabajo para usted.

Afortunadamente, eso es lo que std::vectorhace por usted: es una implementación de matriz de tamaño dinámico, esencialmente, y maneja la administración de memoria para hacer crecer la matriz más allá de su capacidad actual para usted. Definitivamente es la opción que te sugiero que sigas por ahora, pero ten en cuenta que aún querrás crear una Itemclase.

Es muy fácil de usar:

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

vectorProbablemente valga la pena leer la documentación de MSDN para la clase , y si no está familiarizado con las plantillas , que es lo vectorque le permite almacenar "cualquier cosa", también debe repasar los conceptos básicos. Lo que también me lleva a un punto final: si bien parece que un vector puede almacenar cualquier cosa, tiene restricciones para lo que está permitido y, a veces, esto arroja a los principiantes. En particular, el tipo que almacena en un vector debe ser copiable, porque el vector tendrá que hacer una copia de los objetos al cambiar el tamaño de su almacenamiento interno, por ejemplo. La regla de tres de C ++ es algo a tener en cuenta aquí.


fuente
Gracias, esto fue claro y conciso. Estoy leyendo la documentación ahora. ¡Cuando tenga 15 representantes, me aseguraré de volver y votar!
Vladimir Marenus