2

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

AToolConfigurationVector仅包含 6 个原始数据类型。情况总是如此。

AJointVariableVector是特定于 Robotarm 的表示,由class Arm表示。

因此,对于 (say ) 的一个子类表示和转换为(say )的另一个子类的 表示和转换完全不同ArmSimpleArmToolConfigurationVectorArmComplexArm

后来,我想像这样使用这些类:

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)但我不能让它成为静态的,因为它与将它实现为方法(没有静态)的实际对象无关Arm,这对我来说似乎是错误的。

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

4

1 回答 1

0

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

如果你想ToolConfigurationVector::toJointVariableVector创建一个虚拟的类,Arm它的子类特定于哪个子类,要么(A)ToolConfigurationVector必须是虚拟的,其中它产生的子类ArmJointVariableVector是虚拟的,或者(B)ToolConfigurationVector::toJointVariableVector需要提供一个Arm来创建这JointVariableVector将在Arm子类中是虚拟的。即,传递一个Armto toJointVariableVector

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

因此,需要明确的是,JointVariableVector要么有一个指向 an 的指针Arm(因为它的表示是 said 的函数Arm),要么是一个pImpl模式类,基于你的语法(其中 的实例JointVariableVector,而不是指向相同的指针,调用虚拟行为)。说JointVariableVector是如何建造是Arm它来自的功能。ToolConfigurationVector丢失该信息。要重建 a JointVariableVector,您必须将其注入Arm到情况中。

如果JointVariableVector只是类型的函数Arm(而不是实例),那么您可以在它正在创建toJointVariableVector的类型上创建一个模板函数。为了减少对子类的依赖,将调用分派到 的类型上的免费模板函数,然后您可以在每个子类附近实现它并更改生成的。ArmJointVariableVectorToolConfigurationVectorArmToolConfigurationVectorArmArmJointVariableVector

这会给你语法:

Arm * someArm = new ComplexArm();
// ...
JointVariableVector jvv = someArm.currentJointVariableVector();
ToolConfigurationVector tcv = jvv.toToolConfigurationVector();
JointVariableVector how = tcv.toJointVariableVector<ComplexArm>();
于 2012-11-28T16:33:01.570 回答