2012-11-28 75 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