问题描述
我在写一个C ++框架时遇到问题,用户应该有比使用它更少的开销。用户可以通过创建一个包含一个类的共享库来发布他们的工作,该类由一个框架的BaseClass派生,并实现一个externCcreateInstance() - 方法,以便返回一个实例的派生类。因此,框架可以通过使用dlsym()的共享库调用createInstance-Method来访问用户类。 class BaseClass { }
class UserClass:public BaseClass {}
externC{
BaseClass * UserXcreateInstance(){
return new UserClass();
}
}
在框架中:
typedef BaseClass *(* CreateInstance)();
void * handle;
CreateInstance createInstance;
handle = dlopen(libUserLibrary.so,RTLD_LAZY | RTLD_GLOBAL);
createInstance = reinterpret_cast< CreateInstance *> dlsym(handle,UserXcreateInstance);
BaseClass * userX = createInstance();
我的问题:是否可以生成UserXcreateInstance() - 方法,每个用户都是冗余的图书馆,所以用户不必考虑它?
我以为可以使用模板+宏,但我还没有找到一种方式要做到这一点...
另一种方法,我在想,直接通过dlsym和适当的名称来调用任何用户类的构造函数。 (我从配置文件中知道任何命名空间+类名)但是我不认为这是一个正确的解决方案,特别是构造函数调用与常规函数调用不一样,但非常有趣...
我无法想像有一种方法可以自动创建,而不需要对用户的每个部分进行任何编码。我可以想像如何简化它,也许使用宏:
#define OBJECT_CREATOR(X)\
extern C{\
BaseClass * UserXCreateInstance(){\
return new X(); \
} \
}
而用户只需要放在他的cpp文件中:
OBJECT_CREATOR(UserClass);
i have the problem in writing a C++ framework, that users should have less overhead than possible to use it. Users can publish their work to the frameworks by creating a shared library that contains a class, which is derived by a frameworks' BaseClass and implementing an extern "C" createInstance()-method in order to return an instance its' derived class. So the framework can access the user class by calling the createInstance-Method through the shared library with dlsym().
class BaseClass{}
class UserClass : public BaseClass{}
extern "C"{
BaseClass* UserXcreateInstance(){
return new UserClass();
}
}
In framework:
typedef BaseClass* (*CreateInstance) ();
void* handle;
CreateInstance createInstance;
handle = dlopen( "libUserLibrary.so", RTLD_LAZY | RTLD_GLOBAL );
createInstance = reinterpret_cast <CreateInstance*> dlsym( handle, "UserXcreateInstance" );
BaseClass* userX = createInstance();
My Question: Is it possible to generate the UserXcreateInstance()-method, which is redundant in each user library, so that the user don`t have to think about it?
I thought it would be possible with templates+macros, but I haven't yet found a way to do this...
Another approach, I was thinking is directly call the constructor of any user class via dlsym and appropiate name mangling. (I know any namespace + class name from a config file) But I don`t think this a proper solution, especially a constructor call is not the same as a regular function call... but very interesting...
I can't imagine a way to create this automatically without any coding per part of the user. I can imagine ways to simplify it, perhaps using a macro:
#define OBJECT_CREATOR(X) \
extern "C" { \
BaseClass *UserXCreateInstance() {\
return new X(); \
}\
}
And the user just need to put on his cpp file:
OBJECT_CREATOR(UserClass);
这篇关于C ++中的工厂模式:生成显式createInstance() - 方法自动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!