0

我有以下问题要解决。

我有组件 A。这个组件有一些子组件 - B、C、D。使用 cmake 我正在构建或不构建那些 B、C、D 组件。这取决于当前的平台配置。我的 cmake 系统正在制作可执行的 makefile(用于 A 组件),用于仅链接那些在给定 cmake 运行中使用的组件。如果组件 B 已构建,则将其添加到可执行文件中,否则 - 未链接。与其他相同 - C,D。

所有这些 B、C、D 组件都提供了 A 组件中使用的接口的一些实现。此 A 组件应管理 B、C、D 创建的对象,并将这些对象保存在某个映射中,在适当的时间使用适当的对象。

问题:

我想实现一些简单可靠的机制来自动添加那些实现 A 接口的对象,就像现在链接一样 - 链接的只是构建的模块。这些对象也是如此 - 我希望它们仅在编译时才在 A 组件中注册。

我很难解释。这个想法很简单——在编译时构建这些对象的一些映射。只有编译的组件才能将它们的对象传递给这个映射

4

1 回答 1

1

我使用了类似于 Objective-C 和 Smalltalk 实现方法的设计。

在 C++ 中,方法 == 成员函数并且必须在编译时定义。因此,即使接口可以使用预处理器等机制进行扩展,相同的配置也必须影响类的任何客户端,否则它们根本不会链接。

所以我使用消息传递系统来调用对象的方法。因此,如果 A 是主类,并且您在 C 和 D 中编译而不是 B,那么 A 的消息处理器将仅响应具有 C 和 D 注册的处理程序的消息。

这种类型的设计确实需要某种消息传递系统。有许多现有的系统,例如 Google Protocol Buffers 和 Apache Thrift。我选择设计一个,因为我想要比大多数现有系统允许的更多的运行时可配置性(其中许多消息传递系统都涉及 IDL 编译器)。

但是,它确实让我比 C++ 通常允许的混合范式语言更接近 OO 领域。

于 2013-05-08T15:07:59.120 回答