C ++动态加载类

时间:2013-05-11 09:59:38

标签: c++ class dynamic dll load

我仍然对C ++有点新意,所以请耐心等待。

我想要的是能够允许我的程序的用户能够添加他自己的类。我有一个抽象类Module,我的应用程序由一组Module的子类组成。

是否可以搜索特定目录并动态加载Module的子类(由用户添加)?

在Java中,我可以使用org.reflections API实现此目的。 我猜测C ++等价物正在使用DLL。我可能错了。

提前致谢。

1 个答案:

答案 0 :(得分:5)

据我所知,C ++编译模型没有明确,直接的“导出类”方法。但是,您应该能够使用简单的C接口执行此操作:

#include "MyModule.h"

// class MyModule inherits Module

extern "C" Module * create_module() { return new MyModule; }
extern "C" void free_module(Module * p) { delete p; }

现在您可以动态加载该库并检索函数create_modulefree_module,并将它们的函数指针动态添加到您的系统中:

std::map<std::string, std::pair<Module * (*)(), void(*)(Module *)> plugins;

plugins["MyClass"] = std::make_pair(..., ...);   // the dynamically resolved
                                                 // function addresses

实际上,你可能甚至不需要驱逐舰功能,因为普通的虚拟析构函数机器甚至可以在动态加载的库中工作。

例如:

std::unique_ptr<Module> make_module(std::string const & s)
{
    auto it = plugins.find(s);

    return { it == plugins.end() ? nullptr : it->second.first() };
}