我有一个名为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} 没有将对象实现为方法(没有静态)对我来说似乎不对。
如何才能获得优雅的解决方案?当然,这个解决方案也应该是高效的(就所需的类,对象和执行时间而言)。
答案 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}}