gpt4 book ai didi

c++ - 如何在 C++ 中管理并行、依赖继承?

转载 作者:太空狗 更新时间:2023-10-29 21:22:57 26 4
gpt4 key购买 nike

我正在尝试解决一个涉及 C++ 中的并行继承的问题。我为此找到的最近的问题是 Parallel inheritance trees, where classes from one tree have containers of classes from another ,但它并没有完全回答我的问题。

我有一个由三个类组成的模型:Model、Trainer、InstanceProcessor (IP),分别包含模型数据、训练函数和模型处理代码。现在我有这个模型的大约 10 个不同版本,有很多代码重叠但有一些差异,创建了某种形式的并行继承:

Model - ModelA, ModelB, ModelC, ...
Trainer - TrainerA, TrainerB, TrainerC
IP - IPA, IPB, IPC

在代码主体中,我使用 Model* 指针根据解析的参数访问特定模型。

Model 和 Trainer 都需要多个短暂的 IP 实例,Model 还需要一个永久的 Trainer 实例。

我当前的实现使用三个带有一些虚函数的基类,然后对继承自这些基类的特定类建模。这需要我使用大量转换(例如,从 model.h 中的 Trainer* trainer 到 TrainerA 以满足特定需求)。

我怀疑有更优雅的实现方式(使用模板/接口(interface)?),想知道是否有人可以指出正确的方向?谢谢!


编辑:为了从下面的答案中澄清一点,复杂性之一在于我想要例如。 Trainer 类具有函数 basic_train():

Trainer::basicTraining() {
...
IP* ip = new IP(some args);
ip->doStuff();
...
}

现在根据所使用的训练器类型创建适当的 IP。该函数的其余部分不会从 TrainerA 实例更改为 TrainerB 实例。

最佳答案

当两个独立层次结构的成员紧密耦合时,继承不会给你带来太多好处。继承 promises混合匹配策略应该是可能的(即使用 ModelATrainerBIPC),而实际上这是行不通的.

然而,需要认识到的一件非常重要的事情是,模型、训练器和 IP 相互呈现的界面可能不同于它们共同呈现给您的主应用程序的界面:主应用程序将它们视为组统一对象的集合,而模型/训练器/IP 的每个子组(即 ABC 组)将同一组的成员视为高度特化。因此,尽管继承可能对继承层次结构的各个部分不利,但它可能对您的主程序有利。

这会引导您找到使用 abstract factory 的可行解决方案图案。主应用程序获得一个“工厂中的工厂”,可以根据传入的内容为其提供 FactoryAFactoryBFactoryC。每个FactoryX 生成 ModelXTrainerXIPX 对象,将它们作为它们的公共(public)父类(super class)(即模型训练器IP)。

然而,在工厂的内部,实现对象是在知道它们的“对应对象”的确切类型的情况下创建的。例如,当 ModelA 配置有 Trainer 时,它不会采用 Trainer 类型的对象 - 它会得到 TrainerA。由于 FactoryA 知道它创建的对象之间的依赖关系,因此它可以毫无问题地提供正确类型的对象。同时,主程序对这个特化没有概念,部分(ModelATrainerA,和IPA)也没有概念的泛化。

关于c++ - 如何在 C++ 中管理并行、依赖继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19412253/

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