2012-11-28 74 views
2

我有一个班级,名字叫ToolConfigurationVector,班级叫JointVariableVector。 我需要能够在这两个类之间进行转换(它们是相同数据的不同表示)从另一个班级创建特定于其他班级的班级的高效方法

A ToolConfigurationVector只包含6个基本数据类型。情况总是如此。

A 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 = ... 

但这并不适用于我而言,我必须解决这个问题使用ONLY

  • someArm
  • tcv
  • ToolConfigurationVector
  • JointVariableVector

我当然可以给ArmjointVariableVectorFromToolConfigurationVector(ToolConfigurationVector v)一个虚拟的方法,但我不能让它静态的,因为它有什么做其实现为方法的实际Arm对象(没有静态)对我来说似乎是错误的。

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

+0

很抱歉的冠军,但我不能让这个总结。可能被提名为“最差冠军”奖项... –

+0

那么免费功能呢?他们被允许吗? –

+0

你的意思是免费的功能呢?我需要将'ToolConfigurationVector'转换为'JointVariableVector',但是这种转换需要附加信息('someArm'的**类型**)。我知道如何使用'Arm'中的(虚拟)方法来做到这一点,但这对我来说似乎是错误的。 –

回答

0

jvv.toToolConfigurationVector(); // no problem using virtual function表明JointVariableVector保持指针或引用一个Arm子类实例,或它是使用类似的pImpl图案,为了从事行为,它是从所创建的子类Arm虚拟。

如果你想ToolConfigurationVector::toJointVariableVector创建一类是虚拟的什么子类的Arm这是具体到,无论是(A)ToolConfigurationVector必须是虚拟中的Arm子类JointVariableVector将是虚拟的,因为它产生,或( B)ToolConfigurationVector::toJointVariableVector需要提供Arm以创建JointVariableVector,这将在Arm子类中为虚拟。即通过ArmtoJointVariableVector

或者,JointVariableVector可能是某种处女物,在它有意义之前,需要先使用Arm环境才能得到祝福,但这会造成混乱。

所以,要清楚,JointVariableVector要么有一个指针指向一个Arm(因为它的表示是所述Arm的函数),或者是一个pImpl模式类,基于关闭你的语法(其中的JointVariableVector实例,并且不是指针相同,调用虚拟行为)。 JointVariableVector如何构建是它来自的Arm的函数。 ToolConfigurationVector丢失了这些信息。要重建JointVariableVector,您必须注入Arm

如果JointVariableVector只是Arm(而不是实例),那么你可以让toJointVariableVector模板功能上的Arm类型的类型的功能,它是创造了JointVariableVector。要减少ToolConfigurationVectorArm子类的依赖性,请将ToolConfigurationVector调用到类型为Arm的免费模板函数,然后您可以实现与每个Arm子类相邻并更改生成的JointVariableVector

这将使你的语法:

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

谢谢你的回答:) 我有一个问题:我不能使用'ComplexArm',我只能使用'someArm',然后必须包含运行时类型信息,据我了解。我不能'tcv.toJointVariableVector ()',对吗? –

+0

将Arm传入转换函数。在Arm中调用一个虚拟函数来完成工作,或者委托它为baxk。 – Yakk