处理大量接口实现的正确方法是什么?

时间:2012-10-23 03:18:40

标签: c++ interface

对于我当前的一个项目,我有一个定义的接口,我有大量的实现。您可以将其视为具有许多插件的插件接口。

这些“插件”各自处理网络协议中的不同消息类型。 因此,当我收到新消息时,我会遍历我的插件列表,看看谁可以处理它,并通过界面调用它们。

我正在努力解决的问题是如何将所有实现分配,初始化和“加载”到我的数组/矢量/中。

目前我在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
};

2 个答案:

答案 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

其他提示是阅读有关“单身”模式的更多信息,这就是您所拥有的。它在某些情况下很有用,但通常建议不要使用。