我想在散布着循环依赖性的大型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的客户创建Bar,但是我不喜欢它,因为它对构建系统施加了额外的职责,而我首先要进行改进。其次,我想在以后使用延迟加载dll,这种模式可以有效地消除这种情况。第三,由于将使用大量组件来完成此操作,因此一段时间后工厂和初始化程序调用的列表将变得相当大。

存在哪些其他技术可以解决此用例?

最佳答案

(回答自己)abstract factory pattern创建带有基本句柄的派生对象,并且我得出结论,这是对我正在进行的接口/实现分离工作的最佳补充。

如果您在需要创建Bar的任何地方都接受到Bar的链接时间依赖性,那么StoryTeller建议的crtp pattern也可以发挥作用。 Crtp可帮助实现静态多态性,因此可以将对静态createIBar函数的调用中继到静态createBar函数,而常规多态性则无法实现。我无法避免使用此模式的链接时间依赖性。

07-24 14:32