Re: how to get an object instance from its class name?
On 14 mar, 17:29, red floyd <no.s...@here.dude> wrote:
dotNeter wrote:
On Mar 14, 4:51 pm, Michael DOUBEZ <michael.dou...@free.fr> wrote:
dotNeter a =E9crit :
Is there any way for this?
If I get a string representing a class name, how do I new
an instance upon this name?
There is no native way. You have to use a factory i.e. an
object that knows how to build an object from a parameter.
That also means that all such object have a common
ancestor.
There are many way to implement such a factory (builder, prototype ...)=
..
But you have to know the types in advance or have a way to register
them into the factory.
An alternative non-portable way is to put those classes in
a dynamic library and define for each a factory function
(make_<Class>() by example) and then use the dlopen(),
dlsym() calls to open the library and call the factory
function.
This is very fascinating. I've spent some time on factory pattern, but
I don't like to write so many switch-case in my system.
One further question is that if it truly fit my future requirement
since the classes may get enriched someday.
Don't use a switch-case. Use a std::map.
E.g.:
class base { };
class derived1 : public base { };
class derived2 : public base { };
...
class derivedn : public base { };
typedef base (*createfunc )(/*params if needed*/);
std::map<std::string, createfunc> factory_map;
then look up in the map instead of using a case statement.
If you use polymorphic static objects, then you can arrange for
the map to be initialized automatically. (Of course, you can do
that using a map of functions as well, but it's a little bit
more obscure, and IMHO, easier to forget one.)
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34