C++ de los fundamentos al dominio — Lección 6
¿Cuándo utilizar estructuras y clases?
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
Hasta ahora hemos aprendido sobre variables y funciones. Sin embargo, es bastante engorroso administrar la identificación, el nombre y la resistencia del monstruo por separado como variables mientras se crea un juego.
int monsterId = 1;
std::string monsterName = "Slime";
int monsterHealth = 30;
Si hay 100 monstruos, las variables seguirán aumentando. En este caso, las estructuras se utilizan para agrupar datos relacionados.
estructura
#include <string>
struct Item
{
int id;
std::string name;
int price;
};
Item sword{1, "Sword", 100};
Item sword{1, "Sword", 100};El método de ordenar los miembros mediante llaves se llama inicialización agregada. Una estructura no es un fragmento especial de memoria. Es un tipo definido por el usuario que agrupa valores relacionados con nombres.
void PrintItem(const Item& item)
{
std::cout << item.name << '\n';
}
Item MakePotion()
{
return Item{2, "Potion", 50};
}
Las estructuras también se pueden pasar como argumentos a funciones o devolver como valores.std::vector<Item>También se puede guardar en el mismo contenedor.
clase
Si simplemente coloca datos en la estructura, la fuerza física puede cambiarse a un valor extraño desde el exterior.
monster.health = -9999;
buenas noches. Se compila, pero el estado del monstruo está roto. Para evitar que esto suceda, vincule los datos y las operaciones que cambian datos a la misma clase.
#include <algorithm>
#include <string>
class Monster
{
public:
Monster(int id, const std::string& name, int health)
: id(id), name(name), health(health)
{
}
void TakeDamage(int damage)
{
health = std::max(0, health - damage);
}
int GetHealth() const
{
return health;
}
const std::string& GetName() const
{
return name;
}
private:
int id;
std::string name;
int health;
};
publices la parte que debe ser revelada al exterior,privatees una parte que debe usarse sólo dentro de la clase. Ocultar variables miembro como privadas y cambiar su estado mediante funciones públicas se denomina encapsulación.
después del constructor: id(id), name(name), health(health)es la lista de inicialización del constructor. En lugar de asignar valores después de crear un objeto, los miembros se inicializan en el momento de su creación.
Las estructuras y las clases parecen cosas completamente diferentes, pero en C++, la mayor diferencia es que los especificadores de acceso predeterminados son diferentes. Una estructura es pública de forma predeterminada y una clase es privada de forma predeterminada.
Para propósitos simples de agrupar valores, struct es conveniente. Si se quiere proteger al Estado y vincular acciones, una clase es más natural.