Comment créer une instance d’une classe lorsque le nom de la classe est stocké dans une autre variable

Dupliquer possible:
reflection minimale en C ++

Fondamentalement, j’ai le nom de classe stocké dans char * , comment puis-je créer une instance de cette classe. Ce qui suit est ce que je pensais. Cela fonctionne lorsque je passe Test tant que paramètre de modèle, ce qui est correct, mais si j’essaie quelque chose comme ceci Test *t = CreateType cela ne fonctionnera pas.

Y a-t-il un moyen de faire fonctionner cela.

 class Test{ public: Test() { } ~Test() { } }; template  T* CreateType() { return new T; } int main ( int argc, char **argv) { char *ptr = "Test"; Test *T = CreateType(); return 0; } 

Ce n’est pas directement possible en C ++, car le langage n’est pas introspectif.

Vous pouvez cependant essayer de faire quelque chose de similaire. Par exemple, vous pouvez avoir une map< string, baseClassPointer > où la clé sera le nom de la classe et la valeur sera un pointeur sur l’object de cette classe. Ensuite, vous pouvez créer d’autres objects en copiant un object de la carte (obtenu par le nom du type). Je ne suggérerais pas de faire des choses comme ça bien.

Le motif d’usine peut convenir à vos besoins.

Ce n’est pas possible en C ++, car il n’y a pas de mécanisme comme la reflection en C ++. Ce que vous pouvez faire est d’écrire une fabrique, qui sait comment construire un object à partir d’une chaîne.

 class Base { public: virtual ~Base(){} }; class Factory { public: typedef std::function Creator; void Register(const std::ssortingng& key, Creator creator) { creators_[key] = creator; } std::unique_ptr Create(const std::ssortingng& key) { auto creator = creators_[key]; auto instance = std::unique_ptr(creator()); return instance; } private: std::unordered_map creators_; }; class Concrete : public Base { }; int main() { Factory factory; factory.Register("Concrete", [](){ return new Concrete;}); auto instance = factory.Create("Concrete"); }