【问题标题】:How to build objects from similar template classes如何从类似的模板类构建对象
【发布时间】:2013-01-16 21:24:09
【问题描述】:

我的目标如下。

我正在数据分析环境中处理蛋白质。任何给定蛋白质的可用数据都是可变的。我希望能够从更简单的父类构建蛋白质类。每个父类都特定于我可用的数据层。

不同的项目可能有不同的可用数据层。我想为包含与特定数据层相关的所有变量和方法的蛋白质编写简单的类。然后,对于任何给定的项目,能够编译一个项目特定的蛋白质类,该蛋白质类继承自相关数据层特定的蛋白质类。

此外,每个数据层特定的蛋白质类都需要类似的数据层特定的链类、残基类和原子类。它们都是积木。原子用于构建用于构建用于构建蛋白质的链的残基。蛋白质类别需要能够访问其所有原子、残基和链。同样,链需要访问残基和原子。

我使用向量和映射来存储指向相关对象的指针。还有相关的get和set方法。为了提供每个版本的蛋白质变量以及 getter 和 setter 方法,我为原子、残基、链和蛋白质制作了 1 个模板类。这个模板类包含向量、getter 和 setter 方法,这些方法使蛋白质能够访问其链、残基和原子。然后这个模板类被每个数据层特定的蛋白质类继承。

这是最好的方法吗?

【问题讨论】:

    标签: c++ templates inheritance multiple-inheritance class-template


    【解决方案1】:

    首先,使用继承是一种很好的抽象方式,应该可以帮助您轻松构建自定义类,从而为可重用性和维护铺平道路。不过请花点时间考虑一下您的数据结构。使用矢量似乎是最自然的方式然而,要使用动态数据,重新调整向量大小会带来一些开销,有时在处理大数据时,这会成为一个问题。 为了克服这个问题,试着找出每个数据通常拥有的平均数据数。所以你可以有一个数组和一个向量,只有在你完成数组后才能使用向量。这样你就不用不要经常遇到间接费用。 根据您将要进行的实际处理,您可能需要重新考虑您的数据结构。例如,如果您的数据足够小且易于管理,您可以只使用向量并更多地专注于实际计算。如果很大要处理数据集,您可能需要稍微修改数据结构以使处理更容易。祝您好运。

    【讨论】:

      【解决方案2】:

      您可能希望查看Composite Design Pattern 来组织您的多级数据,并查看Visitor Design Pattern 来编写“访问”您的数据结构的算法。

      复合设计模式创建一个组件接口(抽象基类),允许迭代其子层中的所有元素,添加/删除元素等。它还应该有一个accept(some_function) 方法以允许外部算法应用于自身。然后,每个特定层(原子、残基、链)将是派生自 Component 接口的具体类。不要让层从其子层派生:继承应该只反映“is-a”关系,除非在非常特殊的情况下。

      访问者设计模式创建了一个算法层次结构,它独立于数据的精确结构。如果您的数据的类层次结构在可预见的将来不会发生变化,则此模式效果最佳。 [注意:您仍然可以通过用特定数据填充结构来获得所需的任何分子,只是不要更改结构中的层数]。

      无论您做什么,始终建议仅使用继承来重用或扩展接口,并使用组合来重用/扩展数据。例如。 vectormap 等 STL 容器没有虚拟析构函数,也不是为用作基类而设计的。

      【讨论】:

      • 我认为你在正确的轨道上。只是简单地浏览一下就可以让我更好地了解如何描述我的问题。我会更深入地研究它,并可能会进一步提出问题。
      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多