我希望在充满循环依赖性的大型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,这种模式有效地杀死了它。第三,由于这将使用相当多的组件,因此工厂列表和初始化程序调用会在一段时间后变得非常大。
还有哪些其他技术可以处理这个用例?
答案 0 :(得分:0)
(自己回答)abstract factory pattern使用基本句柄创建派生对象,我得出结论,它是我正在进行的接口/实现分离工作的最佳补充。
如果您在创建条形图所需的任何地方接受链接时间依赖关系,那么StoryTeller建议的crtp pattern也可以发挥作用。 Crtp有助于静态多态,因此对静态createIBar函数的调用可以中继到静态createBar函数,这对于常规多态是不可能的。但是,我无法使用此模式避免链接时间依赖性。