【发布时间】:2016-05-24 20:11:55
【问题描述】:
我有一个使用插件的程序。由于我处于开发阶段,这些插件目前只是我在重新编译之前从项目中添加或删除的 .h 和 .cpp 文件,但最终它们将成为库。
每个插件都包含向量中的数据列表,我需要在不知道存在哪些插件的情况下从插件中动态加载数据。例如:
// plugin1.h
extern vector<int> plugin1Data;
// plugin2.h
extern vector<int> plugin2Data;
// main.cpp
vector<vector<int>> pluginDataList;
int CountPlugins () {
// Some function that counts how many plug-ins are present, got this bit covered ;)
}
int main() {
int numPlugins = CountPlugins();
for (int i = 0; i < numPlugins; i++) {
vector<int> newPluginData = /***WAY TO ADD PLUGIN DATA!!!***/;
pluginDataList.push_back(newPluginData);
}
}
我已经在我的 CountPlugins() 函数中访问了每个插件的名称,并且有一个名称列表,所以我的第一直觉是使用每个插件的名称来创建一个变量名称,例如:
vector<string> pluginNames = /*filled by CountPlugins*/;
string pluginDataName = pluginNames.at(i) + "Data";
// Use pluginDataName to locate plugin1Data or plugin2Data
这是我以前在 c# 中做过的事情,当时我曾经搞乱 unity,但我已经阅读了一些 stackoverflow 帖子,清楚地指出这在 c++ 中是不可能的。据我所知,这也是 C# 中相当混乱的解决方案。
如果每个插件都是一个类而不是一组向量,我可以访问特定数据,执行类似 plugin2.data... 的操作,但我仍然需要能够引用存储在每个插件中的对象,并且这意味着当我开始将插件编译为库时,我总是必须链接到类声明和定义,这并不理想(尽管如果它可以提供更好的解决方案也不是不可能的全部)。
在那之后我完全没有想法,欢迎您提供任何帮助!
谢谢!皮特
【问题讨论】:
-
为什么不为你的插件创建一个基本接口并通过纯虚函数检查在运行时使用哪个插件?
-
每个插件都可以“注册”到您的向量中。
-
只需阅读一些关于基类的信息。我想不出一种可以解决我的问题的方法,你能详细说明一下吗?
-
如果我理解你的问题,你问的是如何检查头文件是否被包含。我说的对吗?
-
以简化的方式,使
std::vector<std::vector<int>> pluginDataList;成为一个全局的singleton 并且在插件中可见。每个插件通过一个调用在你的单例中插入数据,这要感谢一个虚拟的static。 (小心Static Initialization Order Fiasco)。