Einführung
In der objektorientierten Programmierung ist es gängige Praxis, zu instanziieren Objekte aus bestimmten Klassen. In bestimmten Szenarien kann es jedoch von Vorteil sein, Objekte basierend auf als Zeichenfolgen gespeicherten Klassennamen dynamisch zu erstellen. Dies kann für mehr Flexibilität und Wartbarkeit des Codes sorgen. Dieser Artikel untersucht die Möglichkeiten, diese dynamische Objekterstellung in C zu erreichen.
Dynamische Objektinstanziierung mithilfe der String-zu-Typ-Konvertierung
Leider bietet C nicht nativ eine Direkter Mechanismus zum Konvertieren von Zeichenfolgen, die Klassennamen enthalten, in tatsächliche Typinformationen. Dies bedeutet, dass statisch definierte Klassen nicht ohne explizite Codeänderungen dynamisch instanziiert werden können.
Alternative Ansätze
Eine direkte String-in-Typ-Konvertierung ist zwar nicht verfügbar, aber dennoch möglich Alternative Techniken zur dynamischen Objekterstellung:
1. Verwenden einer Zuordnungsstruktur:
Sie können eine Zuordnung zwischen Klassennamen (als Zeichenfolgen) und Funktionszeigern erstellen, die Instanzen dieser Klassen erstellen. Dies ermöglicht die dynamische Objekterstellung durch Suchen und Aufrufen des Funktionszeigers.
template <typename T> Base* createInstance() { return new T; } std::map<std::string, Base*(*)()> map; map["DerivedA"] = &createInstance<DerivedA>; // ... and so on
2. Automatische Klassenregistrierung:
Diese Methode beinhaltet die Registrierung von Klassen während der Kompilierung mithilfe von Makros oder Vorlagen. Registrierte Klassen werden automatisch zu einer globalen Karte hinzugefügt, sodass Objekte aus jeder registrierten Klasse unter Verwendung ihres Namens erstellt werden können.
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegister<NAME> reg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister<NAME> NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. Verwenden der Boost-Variante:
Für Szenarien, in denen Objekte unabhängiger Typen erstellt werden müssen, bietet die Boost-Bibliothek eine Variante
typedef boost::variant<Foo, Bar, Baz> variant_type; template <typename T> variant_type createInstance() { return variant_type(T()); }
Fazit
Während C kein direkter String-to-Zugriff vorhanden ist -Typkonvertierung bieten die in diesem Artikel diskutierten alternativen Ansätze eine Möglichkeit, Objekte aus Zeichenfolgen dynamisch zu instanziieren. Durch die Verwendung von Mapping-Strukturen, automatischer Klassenregistrierung oder dem Boost-Variantentyp können Entwickler eine größere Flexibilität und Wartbarkeit des Codes in ihren objektorientierten Anwendungen erreichen.
Das obige ist der detaillierte Inhalt vonWie kann ich C-Objekte dynamisch aus Klassennamenzeichenfolgen instanziieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!