1

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

这些“插件”各自处理网络协议中的不同消息类型。所以当我收到一条新消息时,我会遍历我的插件列表,看看谁能处理它,然后通过接口调用它们。

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

目前我在 main() 中声明所有“插件”,然后调用“plugin_manager.add_plugin(&plugin);” 每一个人。这似乎不太理想。

所以,实际的问题是:1.这种事情有标准化的方法吗?2. 有没有办法定义一个预加载插件的数组(全局?)?3. 我是不是完全走错了路?对于这类问题,还有其他(更好的?)架构选项吗?

谢谢。

编辑:

这编译(请原谅丑陋的代码)......但它似乎有点像一个黑客。另一方面,它解决了分配问题,并清理了 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
};
4

2 回答 2

2

在容器中存储某种形式的智能指针。动态分配插件并在容器中注册,以便以后使用。

您的解决方案的一种可能方法是,如果您有某种形式的插件可以解码的消息 id,则使用从该 id 到处理它的插件的映射。这种方法允许您在给定输入消息的情况下快速查找插件。

于 2012-10-23T03:49:34.410 回答
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()函数中您分配但您从未释放;另一个是构造函数将静态成员设置为NULL.

其他提示是阅读更多关于“单例”模式的信息,这就是你所拥有的。它在某些情况下可能很有用,但通常不建议这样做。

于 2012-10-23T04:50:11.190 回答