1


PVector(ピクセル空間ベクトル)
MVector(メーター空間ベクトル)
RVector(レンダリング空間ベクトル) の3つのタイプにさらに派生するGVectorクラスを作成しています。

class GVector {
  public : 
    eVectorSpace eVS; // Defines which space the vector would be
    float x,y; // The x and y values of a 2-Dimensional vector
    ...
    GVector operator+ (const GVector& v) const { return GVector(x+v.x, y+v.y, v.eVS); }
    ...
};

class MVector {
  public :
    PVector toPVector() {...}
    //Will contain functions to convert the same vector into a different space
};

同じ空間にある2つのベクトルを追加できるようにしたい

MVector operator+ (const MVector& v) const { return MVector(x+v.x, y+v.y); }  

基本クラスをこのように機能させる必要がありますか?

virtual GVector* operator+ (const GVector* v) const () = 0;  

しかし、2つの加算ベクトルと同じ空間にあるベクトルを返したいと思います。

x、yの値を加算する関数は、各タイプのベクトルで同じです。これを基本クラス自体に最小化する方法はありますか?または、同じ空間にベクトルを追加し、それらを異なる空間に変換するためのより良いアプローチはありますか?

4

2 に答える 2

2

2つの異なる子に対して操作を実行する意味がない場合は、親に対して演算子を定義しないでください。代わりに、保護されたヘルパー関数を定義できます。その後、子は、ヘルパー関数に委任して、演算子を個別に実装する必要があります。

于 2012-09-03T02:32:07.117 に答える
1

一部のコードは、2つのベクトルオブジェクトを一緒に追加する方法を知る必要がありますが、実際にはベクトルタイプ自体である必要はありません。クラスの外部で一連の加算演算子を定義できます。

MVector operator+(const MVector &left, const MVector &right) {
    return MVector(left.x + right.x, left.y + right.y);
}

コンパイラがあいまいさなしに型が何であるかを理解できる限り、このように必要な数の異なる演算子の追加を定義できます。MVectorとを受け入れる実装を提供することもできますGVector

MVector operator+(const MVector &left, const RVector &right) {
    MVector tmp = right.toMVector();
    return MVector(left.x + tmp.x, left.y + tmp.y);
}
于 2012-09-03T03:12:39.797 に答える