9.2 Colecciones de Objetos: Inventario con std::vector (1 a N) 🎒
Evoluciona tu arquitectura: haz que un objeto contenga una lista dinámica de otros objetos. Aprende a crear un inventario de pociones que alteran atributos (subir vida, veneno y mejoras de poder).
En la lección anterior vimos cómo un Jugador se vincula con un único objeto (su Espada). Sin embargo, en sistemas reales casi siempre necesitamos manejar colecciones dinámicas de objetos: un carrito de compras con múltiples productos, una biblioteca con cientos de libros, o un Jugador con un inventario de múltiples ítems consumibles.
1. Composición de Uno a Muchos (1 a N)
Para almacenar un número variable de objetos en C++ moderno, utilizamos el contenedor canónico de la STL: std::vector<Tipo>.
📦 Relación de Pertenencia
El Jugador es el dueño del vector. Cuando el jugador recoge una poción, se añade al vector con push_back(). Al consumirla, sus efectos se aplican a los atributos del jugador (subiendo o bajando estadísticas) y el ítem se destruye de la lista con erase().
2. Paso 1: La Clase Ítem (Pocion)
Definimos la clase de los objetos individuales que poblarán el inventario. Cada poción tendrá un nombre, un tipo de efecto y un valor numérico de impacto:
3. Paso 2: La Clase Jugador con std::vector<Pocion>
Incluimos la librería #include <vector> y declaramos el vector como atributo privado dentro de Jugador:
4. Consumir Ítems: Modificando Atributos y Eliminando del Vector
Al usar una poción ocurren tres eventos fundamentales de POO:
- Validación de límites: Comprobamos que el índice solicitado por el usuario exista realmente en el vector (
indice >= 0 && indice < inventario.size()). - Alteración del estado interno del Jugador: Según el tipo de poción, se modifican los atributos
saludofuerza:- CURACIÓN (+Vida): Aumenta la salud sin exceder
saludMaxima. - VENENO (-Vida): Disminuye la salud; si llega a 0, el jugador queda derrotado.
- FUERZA (+Ataque): Aumenta permanentemente el atributo de fuerza física.
- CURACIÓN (+Vida): Aumenta la salud sin exceder
- Eliminación del vector: Usamos
inventario.erase(inventario.begin() + indice)para remover el ítem consumido y reorganizar el contenedor.
5. Ejemplo Completo y Ejecutable
Este programa interactivo muestra la creación del jugador, la recolección de múltiples pociones con distintos efectos, y cómo sus atributos cambian dinámicamente al consumirlas:
10. Herencia y Polimorfismo ⚡
Ahora que dominas la composición ("Tiene-un"), adéntrate en la herencia ("Es-un"): clases base, clases derivadas y métodos virtuales.
Ejercicio de Práctica
1. Agrega a la clase Jugador un límite máximo de capacidad para la mochila (por ejemplo, máximo 4 pociones). Si el inventario ya está lleno, el método recogerPocion() debe mostrar un mensaje advirtiendo que no cabe más peso y no debe agregar la poción.
2. Agrega un nuevo tipo de poción: "MANA" con su correspondiente atributo mana en la clase Jugador.
Comprueba lo que Has Aprendido 🧠
Valida tu comprensión de colecciones dinámicas de objetos y gestión de estado en C++.


