C ++中的运行时接口和对象组合

时间:2014-01-21 14:54:54

标签: c++ interface runtime components

我正在为C ++中基于接口的运行时对象组合寻找一个简单,轻量级的解决方案。我希望能够指定实现这些的接口(方法声明)和对象(可通过工厂模式创建)。在运行时,我希望机制实例化这些对象并基于接口连接器互连这些对象。在运行时调用的方法应该保持相当便宜,即每次调用只有几个指令,与仿函数模式相当。

整个事情需要与平台无关(至少MS Windows和Linux)。解决方案需要获得自由许可,例如开源LGPL或(甚至更好)BSD或其他东西,特别是允许使用商业产品。

我不想要的是网络,进程间通信,额外的编译器步骤(一次性代码生成就可以了),或者对某些重型库(如Qt)的依赖性等重要内容。

具体方案是:我在更大的软件中有这样的机制,但机制实现得不是很好。接口由Dlls导出的基类实现。这些Dll还导出工厂函数,以基于手写的类ID实例化实现对象。

在我开始重新设计并自己实施更好的东西之前,我想知道是否有更好的东西。

编辑:该解决方案还需要支持多线程环境。此外,由于一切都将在同一个过程中发生,因此我不需要任何类型的数据序列化机制。

编辑:我知道这些机制是如何运作的,我知道有几本教学书籍包含相应的例子。我不想自己写。我的问题的目的是:是否存在某种行业标准" lib为此?这是一个小问题(在一个过程中),我真的只是在寻找一个小解决方案。

编辑:我建议添加一个我真正想要做的伪代码示例。所以这就是:

某处我想定义接口。我不在乎它的C-Header或某些语言和代码生成。

class interface1 {
public:
    virtual void do_stuff(void) = 0;
};

class interface2 {
public:
    virtual void do_more_stuff(void) = 0;
};

然后我想提供(多个)实现。这些甚至可以放在基于Dll的插件中。特别是,这两个类在两个不同的Dll中实现,在编译时彼此不了解。

class A : public interface1 {
public:
    virtual void do_stuff(void) {
        // I even need to call further interfaces here
        // This call should, however, not require anything heavy, like data serialization or something.
        this->con->do_more_stuff();
    }
    // Interface connectors of some kind. Here I use something like a template
    some_connector<interface2> con;
};

class B : public interface2 {
public:
    virtual void do_more_stuff() {
        // finally doing some stuff
    }
};

最后,我可以申请主要代码,我希望能够在运行时编写我的应用程序逻辑(例如,基于用户输入):

void main(void) {
    // first I create my objects through a factory
    some_object a = some_factory::create(some_guid<A>);
    some_object b = some_factory::create(some_guid<B>);

    // Then I want to connect the interface-connector 'con' of object 'a' to the instance of object 'b'
    some_thing::connect(a, some_guid<A::con>, b);

    // finally I want to call an interface-method.
    interface1 *ia = a.some_cast<interface1>();
    ia->do_stuff();
}

我完全能够自己编写这样的解决方案(包括所有陷阱)。我正在寻找的是一个解决方案(例如一个库),它由广泛的用户群使用和维护。

2 个答案:

答案 0 :(得分:1)

虽然没有广泛使用,但几年前我写了一个图书馆来做这件事。

你可以在GitHub zen-core library上看到它,它也可以在Google Code上找到

GitHub版本只包含核心库,这真的是你所需要的。 Google Code版本包含许多额外的库,主要用于游戏开发,但它确实提供了很多关于如何使用它的好例子。

该实现的灵感来自Eclipse的插件系统,使用一个指示可用插件列表的plugin.xml文件,以及一个指示您要加载哪些插件的config.xml文件。我还想更改它,以便它不依赖于libxml2,并允许您使用其他方法指定插件。

由于一些黑客,文档已被破坏,但如果您认为这有用,那么我可以编写足够的文档来帮助您入门。

答案 1 :(得分:0)

一位同事给了我另外两个提示:

  1. loki图书馆(源于现代c ++书籍): http://loki-lib.sourceforge.net/
  2. 类似助推器的库: http://kifri.fri.uniza.sk/~chochlik/mirror-lib/html/
  3. 我还没有看到我得到的所有想法。