从另一个类创建另一个特定类的优雅/高效的方法

Elegant/efficient way to create a class specific to another class from another class

本文关键字:另一个 方法 高效 创建      更新时间:2023-10-16

我有一个称为ToolConfigurationVector的类和一个名为JointVariableVector的类。我需要能够在这两个类之间转换(它们是相同数据的不同表示)

ToolConfigurationVector仅由6个基元数据类型组成。情况总是如此。

JointVariableVector是机器人手臂特有的表示,由Arm表示。

因此,对于Arm(如SimpleArm)的一个子类,表示和因此到ToolConfigurationVector的转换与Arm(如ComplexArm)的另一个子类的表示和转换完全不同

稍后,我想使用这样的类:

Arm * someArm = new ComplexArm();
// ...
JointVariableVector jvv = someArm.currentJointVariableVector();
ToolConfigurationVector tcv = jvv.toToolConfigurationVector(); // no problem using virtual function
JointVariableVector how = tcv.toJointVariableVector(); // how?

我不想在ToolConfigurationVector中包含任何关于Arm的哪个子类正在使用的信息,这些信息应该以某种方式存储在JointVariableVector

当然,我可以使用这样的模板:

JointVariableVector<ComplexArm> how = ...

但这不适用于我的情况,我必须使用ONLY来解决这个问题

  • someArm
  • tcv
  • ToolConfigurationVector
  • JointVariableVector

我当然可以给Arm一个像jointVariableVectorFromToolConfigurationVector(ToolConfigurationVector v)一样的虚拟方法,但我不能让它成为静态的,因为它与实际的Arm对象没有任何关系实现它作为方法(没有静态)对我来说似乎是错误的。

我能做些什么来获得一个优雅的解决方案?当然,这个解决方案也应该是高效的(就所需的类、对象和执行时间而言)。

jvv.toToolConfigurationVector(); // no problem using virtual function中,它表示JointVariableVector持有指向Arm子类实例的指针或引用,或者它正在使用类似于pImpl模式的东西,以便在创建它的Arm子类中进行虚拟行为。

如果您希望ToolConfigurationVector::toJointVariableVector创建一个在Arm的哪个子类中是虚拟的类,则(a)ToolConfigurationVector必须是虚拟的,在Arm的哪个子级中,JointVariableVector将是虚拟的;或者(B)ToolConfigurationVector::toJointVariableVector需要提供一个Arm来创建将在Arm子类中虚拟的JointVariableVector。即通过一个ArmtoJointVariableVector

或者,JointVariableVector可能是某种原始对象,稍后需要先使用Arm上下文才能有意义,但这会造成混乱。

因此,需要明确的是,JointVariableVector要么有一个指向Arm的指针(因为它的表示是所述Arm的函数),要么是一个基于语法的pImpl模式类(其中JointVariableVector的实例,而不是指向相同实例的指针,调用虚拟行为)。所述JointVariableVector是如何构建的,这是其来源的Arm的函数。ToolConfigurationVector会丢失该信息。要重建JointVariableVector,必须将Arm重新注入到该情况中。

如果JointVariableVector只是Arm类型的函数(而不是在实例上),那么您可以将toJointVariableVector设置为创建JointVariableVectorArm类型的模板函数。为了减少ToolConfigurationVectorArm子类的依赖,让ToolConfigurationVector将调用调度到Arm类型的免费模板函数,然后可以在每个Arm子类附近实现该函数,并更改生成的JointVariableVector

这会给你语法:

Arm * someArm = new ComplexArm();
// ...
JointVariableVector jvv = someArm.currentJointVariableVector();
ToolConfigurationVector tcv = jvv.toToolConfigurationVector();
JointVariableVector how = tcv.toJointVariableVector<ComplexArm>();