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

时间:2012-11-28 16:19:56

标签: c++ templates design-patterns inheritance

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

ToolConfigurationVector仅由6个原始数据类型组成。情况总是这样。

JointVariableVector是一种特定于Robotarm的表示形式,由 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?

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

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

JointVariableVector<ComplexArm> how = ...

但这不适用于我的情况,我必须使用

解决此问题
  • someArm
  • tcv
  • ToolConfigurationVector
  • JointVariableVector

我当然可以给Arm虚拟方法jointVariableVectorFromToolConfigurationVector(ToolConfigurationVector v),但我无法将其设为静态,并且因为它与实际的{{1} 没有将对象实现为方法(没有静态)对我来说似乎不对。

如何才能获得优雅的解决方案?当然,这个解决方案也应该是高效的(就所需的类,对象和执行时间而言)。

1 个答案:

答案 0 :(得分:0)

jvv.toToolConfigurationVector(); // no problem using virtual function开始,它表示JointVariableVector拥有指向Arm子类实例的指针或引用,或者它使用类似pImpl模式的内容,以便参与在行为中创建的Arm子类中的虚拟行为。

如果您希望ToolConfigurationVector::toJointVariableVector创建一个在特定于Arm的子类中是虚拟的类,则(A)ToolConfigurationVector必须是Arm的子类中的虚拟1}} JointVariableVector将是虚拟的,因为它产生,或者(B)ToolConfigurationVector::toJointVariableVector需要提供Arm来创建JointVariableVector,这将是虚拟的Arm子类。即,将Arm传递给toJointVariableVector

或者,JointVariableVector可能是某种处女对象,后来需要在有意义之前使用Arm上下文祝福,但这会造成混乱。

因此,要清楚,JointVariableVector要么指向Arm(因为它的表示是所述Arm的函数),要么是pImpl模式class,基于您的语法(其中JointVariableVector的实例,而不是指向它的指针,调用虚拟行为)。 JointVariableVector如何构建是Arm来自的ToolConfigurationVector的函数。 JointVariableVector丢失了该信息。要重建Arm,您必须将JointVariableVector注入情境。

如果Arm只是toJointVariableVector类型的函数(而不是实例上的函数),那么您可以使Arm类型为JointVariableVector模板函数它正在创建一个ToolConfigurationVector。要减少对Arm子类的ToolConfigurationVector依赖性,请Arm将调用分派给Arm类型的免费模板函数,然后可以在每个JointVariableVector旁边实现1}}子类并更改生成的Arm * someArm = new ComplexArm(); // ... JointVariableVector jvv = someArm.currentJointVariableVector(); ToolConfigurationVector tcv = jvv.toToolConfigurationVector(); JointVariableVector how = tcv.toJointVariableVector<ComplexArm>();

这将为您提供语法:

{{1}}