2

と呼ばれるクラスとToolConfigurationVectorと呼ばれるクラスがありJointVariableVectorます。これらの2つのクラス間で変換できる必要があります(これらは同じデータの異なる表現です)

AToolConfigurationVectorは6つのプリミティブデータ型のみで構成されています。これは常に当てはまります。

Aは、クラスJointVariableVectorで表されるロボットアームに固有の表現です。 Arm

したがって、(say)の1つのサブクラスの場合、への変換は、 (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

Fromは、サブクラスインスタンスへのポインタまたは参照を保持しているjvv.toToolConfigurationVector(); // no problem using virtual functionこと、またはパターンのようなものを使用して、作成元のサブクラスで仮想的な動作を行うことを示します。JointVariableVectorArmpImplArm

そのサブクラスが固有ToolConfigurationVector::toJointVariableVectorである仮想クラスを作成する場合は、(A)生成するという点で、のサブクラスが仮想になる仮想であるか、(B)作成するために提供される必要があります。これはサブクラスで仮想化されます。つまり、にを渡します。ArmToolConfigurationVectorArmJointVariableVectorToolConfigurationVector::toJointVariableVectorArmJointVariableVectorArmArmtoJointVariableVector

あるいは、JointVariableVectorある種の未使用のオブジェクトである可能性があります。これは、後でArm意味をなす前にコンテキストに恵まれている必要がありますが、それは混乱を招きます。

したがって、明確にするために、(その表現は前述の関数であるため)JointVariableVectorへのポインタを持っているか、構文に基づくパターンクラスです(同じへのポインタではなく、のインスタンスが仮想動作を呼び出します)。どのように構築されるかは、それが由来する機能です。はその情報を失います。再構築するには、状況に戻って注入する必要があります。ArmArmpImplJointVariableVectorJointVariableVectorArmToolConfigurationVectorJointVariableVectorArm

が(インスタンス上ではなく)JointVariableVectorのタイプの関数のみである場合、forを作成しているタイプのテンプレート関数を作成できます。サブクラスへの依存を減らすには、タイプの無料テンプレート関数への呼び出しをディスパッチします。これを各サブクラスに隣接して実装し、生成されたものを変更できます。ArmtoJointVariableVectorArmJointVariableVectorToolConfigurationVectorArmToolConfigurationVectorArmArmJointVariableVector

これにより、構文がわかります。

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