Einführung
In der objektorientierten Programmierung ist die Instanziierung gängige Praxis 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, gibt es aber Alternative Techniken zur Erzielung einer 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.
templateBase* createInstance() { return new T; } std::map<:string base> map; map["DerivedA"] = &createInstance ; // ... 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 DerivedRegisterreg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. Verwenden von Boost Variant:
Für Szenarien, in denen Objekte unabhängiger Typen erstellt werden müssen, stellt die Boost-Bibliothek einen Variante
typedef boost::variantvariant_type; template variant_type createInstance() { return variant_type(T()); }
Fazit
Während C keine direkte String-zu-Typ-Konvertierung aufweist, bieten die in diesem Artikel diskutierten alternativen Ansätze eine Möglichkeit, Objekte dynamisch aus Strings 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.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3