Introduction
Dans la programmation orientée objet, il est courant d'instancier objets de classes spécifiques. Toutefois, dans certains scénarios, il peut être avantageux de créer dynamiquement des objets basés sur des noms de classe stockés sous forme de chaînes. Cela peut offrir une flexibilité et une maintenabilité accrues du code. Cet article explore les possibilités de réaliser cette création d'objet dynamique en C .
Instanciation d'objet dynamique à l'aide de la conversion de chaîne en type
Malheureusement, C ne fournit pas nativement de mécanisme direct pour convertir les chaînes contenant les noms de classe en informations de type réelles. Cela signifie que les classes définies statiquement ne peuvent pas être instanciées dynamiquement sans modifications explicites du code.
Approches alternatives
Bien que la conversion directe de chaîne en type ne soit pas disponible, il existe techniques alternatives pour réaliser la création d'objets dynamiques :
1. Utilisation d'une structure de mappage :
Vous pouvez créer un mappage entre les noms de classe (sous forme de chaînes) et les pointeurs de fonction qui créent des instances de ces classes. Cela permet la création d'objets dynamiques en recherchant le pointeur de fonction et en l'appelant.
templateBase* createInstance() { return new T; } std::map<:string base> map; map["DerivedA"] = &createInstance ; // ... and so on
2. Enregistrement automatique des classes :
Cette méthode implique l'enregistrement des classes lors de la compilation à l'aide de macros ou de modèles. Les classes enregistrées sont automatiquement ajoutées à une carte globale, ce qui permet de créer des objets à partir de n'importe quelle classe enregistrée en utilisant son nom.
#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegisterreg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. Utilisation de Boost Variant :
Pour les scénarios dans lesquels des objets de types non liés doivent être créés, la bibliothèque Boost fournit un type variant
typedef boost::variantvariant_type; template variant_type createInstance() { return variant_type(T()); }
Conclusion
Bien que C manque de conversion directe chaîne en type, les approches alternatives discutées dans cet article fournissent un moyen d'instancier dynamiquement des objets à partir de chaînes. En utilisant des structures de mappage, l'enregistrement automatique des classes ou le type de variante Boost, les développeurs peuvent obtenir une plus grande flexibilité et une plus grande maintenabilité du code dans leurs applications orientées objet.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3