【问题标题】:Pure abstract classes and instantiation of derived types纯抽象类和派生类型的实例化
【发布时间】:2017-04-28 08:12:26
【问题描述】:

我想在充满循环依赖的大型 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 的客户创建 Bars,但我不喜欢它,因为它对构建系统施加了额外的职责,而我一开始就试图改进它。其次,我想在稍后阶段使用延迟加载 dll,这种模式有效地消除了这种情况。第三,由于这将使用相当多的组件来完成,因此工厂列表和初始化程序调用会在一段时间后变得非常大。

还有哪些其他技术可以处理这个用例?

【问题讨论】:

标签: c++ instantiation pure-virtual


【解决方案1】:

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

如果您在需要创建 Bar 的任何地方接受与 Bar 的链接时间依赖关系,StoryTeller 建议的 crtp pattern 也可以发挥作用。 Crtp 有助于静态多态性,因此对静态 createIBar 函数的调用可以中继到静态 createBar 函数,这对于常规多态性是不可能的。不过,我无法避免使用这种模式的链接时间依赖性。

【讨论】:

    猜你喜欢
    • 2015-03-23
    • 2018-06-26
    • 2014-10-13
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多