2016-12-13 204 views
1

我想提高与循环依赖散落大量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,并且这种模式有效地杀死了它。第三,由于这将通过很多组件完成,工厂和初始化器调用的列表在一段时间后会变得相当大。

什么其他的技术存在,可以利用这个用例的照顾?

+1

这可能是你的兴趣http://stackoverflow.com/questions/23626803/can-a-factory-somehow-determine-all-possible-classes-by-looking-in-a-particular/23626894# 23626894 – StoryTeller

回答

0

(回答我自己)abstract factory pattern创建具有基本句柄的派生对象,我认为它是我正在做的接口/实现分离工作的最佳补充。

crtp pattern的建议通过讲故事的人,如果你接受一个链接时依赖于酒吧无处不在,你需要创建一个酒吧也可以发挥作用。 Crtp有助于静态多态性,因此可以将对静态createIBar函数的调用转发给静态createBar函数,这对于常规多态性来说是不可能的。尽管如此,我无法避免使用此模式的链接时间依赖性。