gpt4 book ai didi

C++动态加载类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:35:00 27 4
gpt4 key购买 nike

我对 C++ 还是有点陌生​​,所以请原谅我的笨拙。

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

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

在 Java 中,我可以使用 org.reflections API 实现这一点。我猜 C++ 等价物正在使用 DLL。我可能是错的。

提前致谢。

最佳答案

据我所知,C++ 编译模型没有明确、直接的“导出类”方式。但是,您应该能够使用简单的 C 接口(interface)来完成此操作:

#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

事实上,您甚至可能不需要 destroyer 函数,因为普通的虚拟析构函数机制甚至可以在动态加载的库中工作。

例如:

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

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

关于C++动态加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16495909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com