从它的名字的字符串生成一个派生类的实例。 (即,反射)
-
26-09-2019 - |
题
如果我有一个基类:
class Base
{
public:
virtual void Test()=0;
};
和,一个动态装载的模块中(的.so / .DLL),我实现从该派生的类:
class SomethingFromBase : Base
{
...
};
和,用户,一旦这个库被加载时,要求创建SomethingFromBase
的一个实例(假设我们从CIN的名字。),而且,我们也没有SomethingFromBase
的知识(即,没有办法只是做if(inputstr == "SomethingFrombase") { ... }
是否有任何的方式来创建SomethingFromBase的实例?
我相当肯定这是(标准)C ++是不可能的,但是,我总是希望如此将让我感到吃惊!
如果这是可能增加了一些图书馆,我还是想知道它。 谢谢!
编辑:查看cdhowie的答案。导游实施该技术: http://www.linuxjournal.com/article/3687?page=0,1 http://www.abstraction.net/ViewArticle.aspx?articleID=67
解决方案
您通常需要通过该插件库定义包含指针你可以调用各种功能的结构类型的一些全局变量实现这一目标。 (像安装,拆卸等)在设置功能,他们会回调到您的应用程序的一些“注册”功能,在那里他们可以通过在代表类的名称的字符串,以及工厂函数指针,这将创建一个例如,当执行。
您藏匿在一些地图这一走,当用户输入一个字符串,你看地图,看是否有注册的工厂函数。如果是这样,就调用它。
因此,这不是“真实”反映,但你可以手动将其劈到一定程度。参见,例如,洋泾,它允许可能在协议列表提供许多条目协议插件的说明书。
修改强> 这里是一个极好的指南要实现类似的东西。我更是C的人,所以我不能保证它是真正真棒或什么,但乍一看它看起来不错。我已经做了类似的东西在C对Linux和基本方法效果很好。
其他提示
有地图存储中的类的对象,通过类名作为关键字。 所有这一切需要创建这样的类,需要从一些名字类似“可创建”基类派生 与类的实现给予添加的类需要该对象的代码。
//Creatable.h
#define IMPLEMENT_CREATABLE( ClassName ) \
ObjectMap::Instance().Add( string(ClassName), new ClassName );
//ObjectMap.h. This is a singleton
class ObjectMap
{
...........
map<string, Creatable *> myMap;
...........
public:
void Add( const string &className, Creatable * );
Creatable * Get( const string &className );
};
//My Class.h
class MyClass : public Creatable
{
................
};
//My Class.cpp
IMPLEMENT_CREATABLE(MyClass);
//Client.cpp
string className;
cin>>className;
Creatable *anObject = ObjectMap::Instance().Get( className );