我对 C++ 还是有点陌生,所以请忍受我的菜鸟。
我想要的是能够让我的程序的用户能够添加他自己的类。我有一个抽象类Module
,我的应用程序由Module
.
是否可以搜索特定目录并动态加载Module
(由用户添加)的子类?
在 Java 中,我可以使用 org.reflections API 来实现这一点。我猜 C++ 等价物正在使用 DLL。我可能错了。
提前致谢。
据我所知,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_module
和free_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() };
}