对于我当前的一个项目,我有一个定义的接口,我有大量的实现。您可以将其视为具有许多插件的插件接口。
这些“插件”各自处理网络协议中的不同消息类型。 因此,当我收到新消息时,我会遍历我的插件列表,看看谁可以处理它,并通过界面调用它们。
我正在努力解决的问题是如何将所有实现分配,初始化和“加载”到我的数组/矢量/中。
目前我在main()中声明所有“插件”,然后调用“plugin_manager.add_plugin(& plugin);”每一个人。这似乎不太理想。
所以,实际问题: 1.这种事情是否有标准化的方法? 2.有没有办法定义一个预先加载插件的数组(全局?)? 我完全是错误的做法吗?对于这类问题,还有其他(更好的?)架构选项吗?
感谢。
编辑:
这个编译(请原谅丑陋的代码)......但它有点像黑客。 另一方面,它解决了分配问题,并清理了main()......这是一个有效的解决方案吗?
class intf
{
public:
virtual void t() = 0;
};
class test : public intf
{
public:
test(){}
static test* inst(){ if(!_inst) _inst = new test; return _inst; }
static test* _inst;
void t(){}
};
test* test::_inst = NULL;
intf* ints[] =
{
test::inst(),
NULL
};
答案 0 :(得分:2)
将某种形式的智能指针存储在容器中。动态分配插件并将其注册到容器中,以便以后使用。
对于您的解决方案,一种可能的方法是,如果您有插件可以解码的某种形式的消息ID,则使用该ID中的映射到处理该插件的插件。这种方法允许您在给定输入消息的情况下对插件进行快速查找。
答案 1 :(得分:2)
编写较少代码的一种方法是使用模板进行实例化。然后你只需要编写一个并将其放在接口中,而不是每个实现类都有一个函数。
class intf
{
public:
virtual void t() = 0;
template<class T>
static T* inst()
{
static T instance;
return &instance;
}
};
class test : public intf { ... };
intf* ints[] =
{
intf::inst<test>(),
NULL
};
上面的代码也解决了你的代码中的两个错误:一个是内存泄漏,在你分配的旧inst()
函数中,但你永远不会自由;另一个是构造函数将 static 成员设置为NULL
。
其他提示是阅读有关“单身”模式的更多信息,这就是您所拥有的。它在某些情况下很有用,但通常建议不要使用。