Café y Código

9. POO básico

La Programación Orientada a Objetos (POO) nos permite estructurar el código pensando en entidades del mundo real o de un videojuego.

1. Clases vs Objetos (La clase Espada)

Una clase es como el plano o plantilla. Un objeto es una instancia concreta creada a partir de esa plantilla.

Clase Espada y creación de objetos
CPP
1#include <iostream>
2#include <string>
3
4using namespace std;
5
6class Espada {
7private:
8 string name;
9 string type;
10 int damage;
11 int durability;
12
13public:
14 // Constructor
15 Espada(string name, string type, int damage, int durability) {
16 this->name = name;
17 this->type = type;
18 this->damage = damage;
19 this->durability = durability;
20 }
21
22 // Métodos
23 void atacar() {
24 cout << name << " ataca y causa " << damage << " de daño." << endl;
25 durability--;
26 }
27
28 void mostrarInfo() {
29 cout << "Nombre: " << name << "\n"
30 << "Tipo: " << type << "\n"
31 << "Daño: " << damage << "\n"
32 << "Durabilidad: " << durability << endl;
33 }
34};
35
36int main() {
37 // Creación de objetos a partir de la clase Espada
38 Espada excalibur("Excalibur", "Legendaria", 100, 50);
39 Espada katana("Katana", "Samurai", 70, 80);
40 Espada espadaHierro("Espada de Hierro", "Medieval", 40, 100);
41
42 excalibur.mostrarInfo();
43 excalibur.atacar();
44
45 return 0;
46}

2. Encapsulamiento: private, public y Getters/Setters

Los atributos definidos como private solo se pueden acceder o modificar desde dentro de la propia clase.

¿Es obligatorio crear get y set para todos los atributos?
No. Solo debes crearlos cuando sea necesario acceder o modificar un atributo desde fuera de forma controlada (por ejemplo, para validar que el daño no sea negativo). Si un valor solo se usa internamente (como la durabilidad al usar la espada), no necesitas getters ni setters para él.

Uso práctico de Getters y Encapsulamiento
CPP
1class Espada {
2private:
3 string name;
4 int damage;
5 int durability;
6
7public:
8 Espada(string name, int damage, int durability)
9 : name(name), damage(damage), durability(durability) {}
10
11 // Getter: Solo lectura para consultar el daño desde fuera
12 int getDamage() const {
13 return damage;
14 }
15
16 string getName() const {
17 return name;
18 }
19
20 // Método que modifica el estado interno sin requerir un setter
21 void usar() {
22 durability--;
23 if (durability < 0) durability = 0;
24 }
25};

3. Asociación entre Clases (Player tiene una Espada)

Las clases pueden relacionarse entre sí. Por ejemplo, un Player puede contener una Espada como atributo y combatir contra otro Player.

Combate entre Players usando la clase Espada
CPP
1#include <iostream>
2#include <string>
3
4using namespace std;
5
6class Espada {
7private:
8 string name;
9 string type;
10 int damage;
11 int durability;
12
13public:
14 Espada(string name, string type, int damage, int durability)
15 : name(name), type(type), damage(damage), durability(durability) {}
16
17 int getDamage() const { return damage; }
18 string getName() const { return name; }
19
20 void usar() {
21 durability--;
22 if (durability < 0) durability = 0;
23 }
24};
25
26class Player {
27private:
28 string name;
29 int health;
30 Espada espada;
31
32public:
33 Player(string name, int health, Espada espada)
34 : name(name), health(health), espada(espada) {}
35
36 // Recibe otro Player por referencia para aplicarle el ataque
37 void atacar(Player &enemigo) {
38 cout << name << " ataca a " << enemigo.name
39 << " usando " << espada.getName() << "!" << endl;
40
41 enemigo.health -= espada.getDamage();
42 espada.usar();
43
44 if (enemigo.health < 0) enemigo.health = 0;
45 }
46
47 void mostrarEstado() const {
48 cout << name << " | Vida: " << health << endl;
49 }
50
51 bool estaVivo() const {
52 return health > 0;
53 }
54};
55
56int main() {
57 Espada excalibur("Excalibur", "Legendaria", 30, 100);
58 Espada katana("Katana", "Samurai", 20, 100);
59
60 Player guerrero("Guerrero", 100, excalibur);
61 Player samurai("Samurai", 100, katana);
62
63 guerrero.mostrarEstado();
64 samurai.mostrarEstado();
65
66 cout << "\n--- COMBATE ---\n" << endl;
67
68 guerrero.atacar(samurai);
69 samurai.mostrarEstado();
70
71 samurai.atacar(guerrero);
72 guerrero.mostrarEstado();
73
74 return 0;
75}

Ejercicio

Agregá a la clase Espada una comprobación para que si durability == 0, la espada ya no cause daño en getDamage() o devuelva 0 de daño. Luego probá realizar varios ataques en main() hasta romper la espada.

Dato curioso: C++ apareció en 1985; Bjarne Stroustrup en Bell Labs. Wikipedia

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.