C+中的工厂模式+;:自动生成显式createInstance()-方法 我在编写C++框架时遇到了问题,用户应该有比使用它更少的开销。用户可以通过创建一个共享库将其工作发布到框架,该库包含一个类,该类由框架的基类派生,并实现一个extern“C”createInstance()-方法,以便将实例返回其派生类。因此,框架可以通过使用dlsym()通过共享库调用createInstance方法来访问用户类

C+中的工厂模式+;:自动生成显式createInstance()-方法 我在编写C++框架时遇到了问题,用户应该有比使用它更少的开销。用户可以通过创建一个共享库将其工作发布到框架,该库包含一个类,该类由框架的基类派生,并实现一个extern“C”createInstance()-方法,以便将实例返回其派生类。因此,框架可以通过使用dlsym()通过共享库调用createInstance方法来访问用户类,c++,design-patterns,factory,createinstance,dlsym,C++,Design Patterns,Factory,Createinstance,Dlsym,在框架内: typedef BaseClass* (*CreateInstance) (); void* handle; CreateInstance createInstance; handle = dlopen( "libUserLibrary.so", RTLD_LAZY | RTLD_GLOBAL ); createInstance = reinterpret_cast <CreateInstance*> dlsym( handle, "UserXcreateInstance

在框架内:

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();
typedef基类*(*CreateInstance)();
无效*手柄;
CreateInstance CreateInstance;
handle=dlopen(“libUserLibrary.so”,RTLD_LAZY | RTLD_GLOBAL);
createInstance=reinterpret_cast dlsym(句柄,“UserXcreateInstance”);
基类*userX=createInstance();
我的问题:是否可以生成UserXcreateInstance()-方法,该方法在每个用户库中都是冗余的,这样用户就不必考虑它了

我认为使用模板+宏是可能的,但我还没有找到一种方法来做到这一点


我认为另一种方法是通过dlsym直接调用任何用户类的构造函数,并使用适当的名称mangling。(我从配置文件中知道任何名称空间+类名),但我认为这不是一个合适的解决方案,尤其是构造函数调用与常规函数调用不同。。。但是非常有趣…

我无法想象一种方法能够自动创建这个,而不需要对用户的每个部分进行任何编码。我可以想象简化它的方法,也许可以使用宏:

#define OBJECT_CREATOR(X) \
    extern "C" {          \
         BaseClass *UserXCreateInstance() {\
             return new X(); \
         }\
    }
用户只需在其cpp文件中输入:

OBJECT_CREATOR(UserClass);

我无法想象有一种方法可以自动创建这个,而不需要对用户的每个部分进行任何编码。我可以想象简化它的方法,也许可以使用宏:

#define OBJECT_CREATOR(X) \
    extern "C" {          \
         BaseClass *UserXCreateInstance() {\
             return new X(); \
         }\
    }
用户只需在其cpp文件中输入:

OBJECT_CREATOR(UserClass);

我假设通过
dlsym
调用用户函数不是绝对要求

您想要的东西很容易通过使用来实现。静态帮助对象的构造函数然后在中央存储库中注册相关数据。应该是这样的:

template <typename UserClass>
class BaseClass
{
  private:
    class UserObjectFactory
    {
      UserObjectFactory()
      {
        std::string myname = typeid(UserClass).name();
        CentralObjectFactory::instance()->register(this, myname);
      }
      BaseClass* XUserCreateInstance()
      {
        return new UserClass;
      }            
    };
    static UserObjectFactory factory; 
};

此设计是否满足您的需要?

我假设通过
dlsym
调用用户函数不是绝对要求

您想要的东西很容易通过使用来实现。静态帮助对象的构造函数然后在中央存储库中注册相关数据。应该是这样的:

template <typename UserClass>
class BaseClass
{
  private:
    class UserObjectFactory
    {
      UserObjectFactory()
      {
        std::string myname = typeid(UserClass).name();
        CentralObjectFactory::instance()->register(this, myname);
      }
      BaseClass* XUserCreateInstance()
      {
        return new UserClass;
      }            
    };
    static UserObjectFactory factory; 
};

这个设计能满足你的需要吗?

你的想法听起来很有趣,但对我来说不管用。未实现静态帮助器类的构造函数。。。这应该通过用户共享库的dlopen调用实现,还是有更多的先决条件?哦,非常抱歉,这确实不起作用。如果我能修好的话,我会告诉你的。你的主意听起来很有趣,但对我不起作用。未实现静态帮助器类的构造函数。。。这应该通过用户共享库的dlopen调用实现,还是有更多的先决条件?哦,非常抱歉,这确实不起作用。如果我能修好,我会告诉你的。谢谢你,一行比四行好;)谢谢,一行比四行好;)