"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment puis-je instancier dynamiquement des objets C++ à partir de chaînes de noms de classe ?

Comment puis-je instancier dynamiquement des objets C++ à partir de chaînes de noms de classe ?

Publié le 2024-12-25
Parcourir:160

How Can I Instantiate C   Objects Dynamically from Class Name Strings?

Instanciation d'objet flexible à partir de chaînes de nom de classe

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.

template  Base* 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 DerivedRegister reg

#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. Ce type peut contenir des valeurs de différents types, accessibles dynamiquement en fonction des informations de type stockées.

typedef boost::variant variant_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.

Dernier tutoriel Plus>

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