gpt4 book ai didi

c++ - 在编译时决定构造对象

转载 作者:行者123 更新时间:2023-11-28 07:37:36 25 4
gpt4 key购买 nike

我有以下问题需要解决。

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

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

问题:

我想实现一些简单可靠的机制来自动添加那些实现 A 接口(interface)的对象,就像现在使用链接一样——链接的只是构建的模块。与那些对象相同 - 我希望仅在编译它们时将它们注册到 A 组件中。

我很难解释。这个想法很简单 - 在编译时构建这些对象的一些映射。只有编译的组件才能将其对象传递到此 map

最佳答案

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

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

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

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

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

关于c++ - 在编译时决定构造对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16442295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com