gpt4 book ai didi

c++ - 纯抽象类和派生类型的实例化

转载 作者:太空宇宙 更新时间:2023-11-04 13:08:21 25 4
gpt4 key购买 nike

我想在充斥着循环依赖的大型 C++ 代码库中缩短编译时间。我决定主要使用纯抽象接口(interface)来减少循环依赖,从而能够将项目拆分成更小的模块。

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 中链接,这是我试图避免的。所以我需要某种工厂,它可以只为使用此接口(interface)的客户工作。

在我们的代码库中,我们已经采用了一种模式,在该模式中,我们创建了运行时初始化器,这些初始化器实例化派生类以履行接口(interface)的职责。这是由构建系统根据固定模式识别初始化函数来完成的,这些函数通过 extern int 定义“链接”到主应用程序中,因此所有实例化都在应用程序启动时运行。

我可以使用此模式创建一个工厂,为只了解 IBar 的客户创建 Bars,但我不喜欢它,因为它对构建系统强加了额外的职责,而我首先要尝试改进的是。其次,我想在稍后阶段使用延迟加载 dll,而这种模式有效地消除了这种情况。第三,由于这将通过相当多的组件完成,一段时间后工厂和初始化程序调用的列表会变得非常大。

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

最佳答案

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

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

关于c++ - 纯抽象类和派生类型的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41118184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com