9.1 Asociación de Clases: Relación "Tiene-Un" (1 a 1) ⚔️
Aprende cómo conectar dos entidades independientes en C++: haz que tu clase Jugador posea una Espada como atributo, delegue el combate e intercambie armas en caliente.
En el mundo real y en la arquitectura de software, los objetos rara vez existen de forma aislada. Un auto tiene un motor, una computadora tiene un procesador, y en un videojuego, un Jugador tiene una Espada.
1. ¿Qué es la Asociación y la Composición?
En POO existen dos formas principales de relacionar clases:
🔗 Composición / Asociación ("Tiene-Un")
Una clase almacena una instancia de otra clase dentro de sus atributos privados.
Ejemplo: Jugador tiene una Espada. Es la técnica más flexible y recomendada para ensamblar sistemas modulares.
🏛️ Herencia ("Es-Un")
Una clase deriva de otra más genérica.
Ejemplo: Guerrero es un Personaje. Se utiliza cuando hay una jerarquía de tipos (lo veremos en la lección 10).
El lema clásico de la ingeniería de software es: "Favorece la composición sobre la herencia". Al componer objetos, tus clases se mantienen desacopladas, testeables y fáciles de modificar.
2. Paso 1: Definir la Clase Componente (Espada)
Antes de que el Jugador pueda tener una espada, necesitamos que la clase Espada esté claramente modelada con sus propios atributos y encapsulamiento:
3. Paso 2: La Clase Contenedora (Jugador)
Ahora declaramos el atributo Espada espadaEquipada; dentro de la clase Jugador. Fíjate cómo la inicializamos en la lista de inicialización del constructor:
4. Delegación y Paso por Referencia en Métodos
Cuando el jugador ejecuta la acción atacar(Jugador &objetivo):
- Paso por referencia (
Jugador &objetivo): Usamos el símbolo¶ recibir la referencia directa del enemigo en memoria. Si no pusiéramos&, C++ crearía una copia efímera y los puntos de vida del enemigo original nunca bajarían. - Delegación de responsabilidades: El jugador no inventa el cálculo de daño; le pregunta a su arma:
int danio = espadaEquipada.getDanio();y luego la desgasta conespadaEquipada.desgastar();.
5. Ejemplo Completo y Ejecutable
Copia este código en tu entorno de desarrollo para ver en acción el combate completo, la durabilidad y el cambio dinámico de arma:
9.2 Inventario de Objetos con std::vector (1 a N) 🎒
Un guerrero no solo lleva una espada: ¡también lleva una mochila con pociones que suben vida, venenos y elixires de poder!
Ejercicio de Práctica
Crea una clase Escudo con atributos nombre, defensa y durabilidad. Luego agrégale al Jugador un atributo Escudo escudoEquipado;. En el método recibirDanio(), calcula el daño real restando la defensa del escudo antes de descontar vida.
Comprueba lo que Has Aprendido 🧠
Valida tu comprensión de composición, paso por referencia y delegación entre objetos en C++.


