纯抽象类和派生类型的实例化
Pure abstract classes and instantiation of derived types
我想在大型的C 代码基础上改善编译时间,并散布着循环依赖关系。我决定使用主要使用纯抽象界面来减少循环依赖性,从而可以将项目分为较小的模块。
ibar.h:
struct IBar {
IBar();
virtual ~IBar();
virtual void foo() = 0;
}
std::unique_ptr<IBar> createIBar();
bar.cpp:
#include "ibar.h"
class Bar : IBar {
Bar();
virtual ~Bar();
virtual void foo() {<do stuff>;}
}
现在,我的CreateIbar函数需要在某个地方定义。如果我在bar.cpp中定义它,那么使用ibar.h的任何人都需要在bar.o中链接,这是我要避免的。因此,我需要某种工厂,只能使用此接口才能适用于客户。
在我们的代码库中,我们已经在使用一种模式,在该模式中,我们创建了运行时的初始化器,该模式可以实例化派生类以履行接口的职责。这是由构建系统完成的,该系统识别基于固定模式的初始化器函数,这些功能通过Extern Int定义将其"链接到主应用程序中,因此应用程序启动时所有实例化。
我可以使用这种模式来创建一个工厂,该工厂只知道ibar,但我不喜欢它,因为它首先要在构建系统上施加额外的职责。其次,我想在以后的阶段使用懒惰的dll,这种模式有效地杀死了这一点。第三,由于这将使用很多组件来完成,因此一段时间后的工厂和初始调用列表将增长很大。
还有哪些其他可以照顾此用例的技术?
(回答我自己)抽象出厂模式用基本手柄创建派生的对象,我得出的结论是,这是我正在做的接口/实现分离工作的最佳补充。
讲故事的人建议的CRTP模式也可以发挥作用,如果您接受链接时间依赖关系到任何创建栏所需的bar。CRTP有助于静态多态性,因此可以将静态创建函数的调用传递到静态创建键函数,而常规多态性则是不可能的。我无法使用此模式避免链接时间依赖性。
相关文章:
- 检查某些类型是否是模板类 std::optional 的实例化
- 在 c++ 中的模板实例化中使用带有构造函数的类作为类型参数
- 实例化模板时,我是否必须显式显示参数包中的类型?
- 在实例化之前推断函数模板的返回类型
- 对象实例化与类型C++
- 使用用户定义的类型 UDT 实例化 std::atomic<>。如果 UDT 具有虚函数,则 l 墨水将失败。为什么?
- 根据实例化点期望不同的类型
- 类模板实例化中的类型转换
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 实例化多种类型的成员函数模板
- C++ 多态模板类,模板类型对象的实例化
- 从模板实例化/类型推断中查找错误消息的实际来源
- MPL地图实例化类型
- SFINAE将实例化类型限制为std::chrono::duration类型
- 实例化类型模板化类的非类型模板化成员函数
- 使用大括号初始化列表或传统的 ctor 语法实例化类型
- 何时检查C++模板实例化类型
- 使LLDB将地址重新解释为指向模板实例化类型对象的指针
- 标准::shared_ptr 失去常量的实例化类型
- c++模板:我可以/如何使用结构体作为模板的实例化类型