C++ von den Grundlagen bis zum Profi — Folge 6
Wann sollte man Strukturen und Klassen verwenden?
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Bisher haben wir etwas über Variablen und Funktionen gelernt. Allerdings ist es ziemlich umständlich, beim Erstellen eines Spiels die Monster-ID, den Namen und die Ausdauer separat als Variablen zu verwalten.
int monsterId = 1;
std::string monsterName = "Slime";
int monsterHealth = 30;
Bei 100 Monstern erhöhen sich die Variablen weiter. In diesem Fall werden Strukturen verwendet, um zusammengehörige Daten zu gruppieren.
Struktur
#include <string>
struct Item
{
int id;
std::string name;
int price;
};
Item sword{1, "Sword", 100};
Item sword{1, "Sword", 100};Die Methode, Mitglieder mithilfe geschweifter Klammern in die richtige Reihenfolge zu bringen, wird als Aggregatinitialisierung bezeichnet. Eine Struktur ist kein spezieller Speicherblock. Es handelt sich um einen benutzerdefinierten Typ, der verwandte Werte mit Namen gruppiert.
void PrintItem(const Item& item)
{
std::cout << item.name << '\n';
}
Item MakePotion()
{
return Item{2, "Potion", 50};
}
Strukturen können auch als Argumente an Funktionen übergeben oder als Werte zurückgegeben werden.std::vector<Item>Es kann auch im selben Behälter aufbewahrt werden.
Klasse
Wenn Sie nur Daten in die Struktur einfügen, kann die physische Stärke von außen auf einen seltsamen Wert geändert werden.
monster.health = -9999;
Gute Nacht. Es wird kompiliert, aber der Zustand des Monsters ist fehlerhaft. Um dies zu verhindern, verknüpfen Sie Daten und Vorgänge, die Daten ändern, mit derselben Klasse.
#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;
};
publicist der Teil, der nach außen preisgegeben werden soll,privateist ein Teil, der nur innerhalb der Klasse verwendet werden darf. Das Ausblenden von Mitgliedsvariablen als privat und das Ändern ihres Zustands durch öffentliche Funktionen wird als Kapselung bezeichnet.
nach dem Konstruktor: id(id), name(name), health(health)ist die Konstruktor-Initialisierungsliste. Anstatt Werte zuzuweisen, nachdem ein Objekt erstellt wurde, werden Mitglieder in dem Moment initialisiert, in dem sie erstellt werden.
Strukturen und Klassen scheinen völlig unterschiedliche Dinge zu sein, aber in C++ besteht der größte Unterschied darin, dass die Standardzugriffsspezifizierer unterschiedlich sind. Eine Struktur ist standardmäßig öffentlich und eine Klasse ist standardmäßig privat.
Für einfache Zwecke der Gruppierung von Werten ist struct praktisch. Wenn Sie den Zustand schützen und Aktionen binden möchten, ist eine Klasse natürlicher.