2

私はマトリックスクラスを作成しています(主に自己課された練習のために、私はEigenについて知っています)。その中で、行列の乗算が期待どおりに定義されています。このメソッドは、Matrix オブジェクトへの const 参照を取り、Matrix オブジェクトを返します。

Matrix Matrix::operator *(const Matrix& rhs) const
{
    Matrix temp(mRows,rhs.mCols);
    ... //do Matrix Multiplication
    return temp;
}

次に、DCM クラス (Direction Cosine Matrix -- 特殊な種類の行列) を派生させます。

class DCM: public Matrix
{
    .... // class definition here, but does NOT contain definition for
         // matrix multiplication    
};

2 つの DCM オブジェクトを作成し、それらを乗算することは問題ありませんが、返されるオブジェクトは Matrix 型です。

DCM Rvb_q(q);

DCM Rvb_p(p);

DCM Rvb_pq(Rvb_p*Rvb_q); // error because Rvb_p*Rvb_q returns a Matrix object

派生クラスで関数を再コーディングせずに、その関数が DCM オブジェクトを返すようにする方法はありますか? 1 つの方法は、このコンストラクターを派生クラスに追加することです。

    DCM(const Matrix &M):Matrix(M) {}

しかし、それは非常に非効率的 (乗算用の新しいオブジェクトを作成し、DCM オブジェクトを作成するときにそれをコピーする) と制限 (2 つの DCM オブジェクトを乗算するときはいつでも、Matrix オブジェクト用の新しい DCM オブジェクトを作成する必要があるようです)にコピーされました-返されたオブジェクトを DCM として使用することはできませんでした)。基本クラス関数を再利用する方法はありますが、派生クラスの型を返すようにしますか?

4

2 に答える 2

1

行列から継承するものが同じ型に乗算される (乗算で閉じられている) 場合は、次のようにハックできます。

template <class TMatrix>
TMatrix Matrix::operator *(const TMatrix& rhs)
{
    TMatrix temp(mRows, rhs.mCols);
    // multiply
    return temp;
}

しかし、私はそれをお勧めしません。このような場合、DCM を DCM で乗算すると DCM になることを明示する方がよいと思います。

DCM DCM::operator *(const DCM& rhs)
{
    return Matrix::operator*(rhs);
}

この場合、 (おそらく private) も宣言する必要がありますDCM(const Matrix&) and DCM(Matrix&&)

于 2013-10-05T05:28:19.430 に答える