Erzeugen von Klassentyp-IDs (C++)
Ich habe die __COUNTER__
um automatisch Typ-IDs für Entities & Colliders in einem objektorientierten Spiel zu generieren.
Dieses Spiel verwendet Polymorphismus, um seine Funktionalität zu erreichen. Um Child-Objekte zu serialisieren, musste ich einen Weg finden, um Entity Child-Typen zu speichern und sie für das Speichern und Laden von Szenen zu serialisieren/deserialisieren. Wenn ich eine Entität aus einer Speicherdatei lese (deserialisiere), musste ich wissen, welche Eigenschaften zu erwarten sind; mit __COUNTER__
Ich habe eine eindeutige und konstante ID für jede Entitätsklasse und kann sie mit dieser ID als den richtigen Entitätstyp laden.
Dieser Ansatz bedeutet, dass ich, um einen neuen Entity-Typ serialisierbar zu machen, nur Folgendes hinzufügen muss typeID = __COUNTER__;
innerhalb des Konstruktors, um die Standard-ID zu überschreiben. Im Fall von Sprite:
Sprite(/* TODO: Sprite Arguments */) : Entity(/* TODO: Entity Arguments */) {
typeID = __COUNTER__;
}
... und fahren Sie damit fort, die Überlastungen des iostream zu skizzieren:
friend std::ostream& operator<<(std::ostream& os, const Sprite& rhs) {
return os << /* TODO: Outline Output */;
}
friend std::istream& operator>>(std::istream& is, Sprite& rhs) {
return is >> /* TODO: Outline Input */;
}
Es ist ein sehr leichtgewichtiger Ansatz zur Erzeugung von Typ-IDs für Ihre Klassen und vermeidet einen Haufen komplizierter Logik. Als Präprozessor-Befehl ist es ziemlich einfach, aber es bietet ein nützliches Werkzeug für einige wichtige Anwendungen.
Anmerkung: Wenn Sie den ID-Wert beim Aufruf des Zählers wieder auf 0 setzen wollen, speichern Sie seinen Wert bei der Erzeugung Ihrer ersten ID und subtrahieren Sie alle nachfolgenden IDs von diesem Wert.
Vielen Dank fürs Lesen! -YZM