2011-12-26 5 views

答えて

1
#include <memory> 

using namespace std; 

template<class Real, int Size> class TVector { 
protected: 
    Real *_values; 
public: 
    TVector() { 
    // allocate buffer 
    _values = new Real[Size]; 
    } 
    TVector(Real *prValues) { 
    // check first 
    if (prValues == 0) 
     throw std::exception("prValues is null"); 
    // allocate buffer 
    _values = new Real[Size]; 
    // initialize buffer with values 
    for (unsigned int i(0U) ; i < Size ; ++i) 
     _values[i] = prValues[i]; 
    } 
    // Do not forget copy ctor 
    TVector(TVector<Real, Size> const &rTVector) { 
    // allocate buffer 
    _values = new Real[Size]; 
    // initialize with other vector 
    *this = rTVector; 
    } 
    virtual ~TVector() { 
    delete [] _values; 
    } 
    virtual Real &operator[](int iIndex) { 
    // check for requested index 
    if (iIndex < 0 || iIndex >= Size) 
     throw std::exception("requested index is out of bounds"); 
    // index is correct. Return value 
    return *(_values+iIndex); 
    } 
    virtual TVector<Real, Size> &operator=(TVector<Real, Size> const &rTVector) { 
    // just copying values 
    for (unsigned int i(0U) ; i < Size ; ++i) 
     _values[i] = rTVector._values[i]; 
    return *this; 
    } 
    virtual TVector<Real, Size> &operator+=(TVector<Real, Size> const &rTVector) { 
    for (unsigned int i(0U) ; i < Size ; ++i) 
     _values[i] += rTVector._values[i]; 
    return *this; 
    } 
    virtual TVector<Real, Size> operator+(TVector<Real, Size> const &rTVector) { 
    TVector<Real, Size> tempVector(this->_values); 
    tempVector += rTVector; 
    return tempVector; 
    } 
}; 

template<class Real> class TVector2: public TVector<Real, 2> { 
public: 
    TVector2() {}; 
    TVector2(Real *prValues): TVector(prValues) {} 
    TVector2 &operator=(TVector2<Real> const &rTVector) { 
    return static_cast<TVector2 &>(TVector<Real, 2>::operator=(rTVector)); 
    } 
    TVector2 &operator+=(TVector2<Real> const &rTVector) { 
    return static_cast<TVector2 &>(TVector<Real, 2>::operator+=(rTVector)); 
    } 
    TVector2 operator+(TVector2<Real> const &rTVector) { 
    return static_cast<TVector2 &>(TVector<Real, 2>::operator+(rTVector)); 
    } 
    Real &X() { return _values[0]; } 
    Real &Y() { return _values[1]; } 
}; 

int main(int argc, char** argv) { 
    TVector2<int> v = TVector2<int>(); 
    v[0]=0; 
    v[1]=1; 
    TVector2<int> v1 = TVector2<int>(); 
    v1.X() = 10; 
    v1.Y() = 15; 
    v = v1; 
    v += v1; 
    v = v + v1; 
    return 0; 
} 

いくつかのその他の注意事項:

  1. それはあなたがnewのに対してmallocを使用することは非常に悪いです。 Realは、あなたのケースでは、vectorがうまく動作するようにPODにすることができます。 mallocがPODでより良いパフォーマンスを提供していると思われる場合は、newを使用するか、カスタム作成ポリシーを提供してください。また、freeの代わりにdelete []を使用してメモリバッファを破壊することを忘れないでください。
  2. オーバーロード時に境界チェックを実行する方が、パフォーマンスを向上させるために、後置式の代わりに++iを使用することをお勧めします。operator[]
  3. 前者では、一時的な値は作成されません。
+0

あなたのアドバイスに感謝しますが、これは演算子+ =本体ですか?感情演算子はうまく動作するからです。 – fso

+0

ほんの少しです。私はコードを提供します。 – DaddyM

+0

(私はここに投稿してからasnwerを投稿することはできません)演算子+は以下のようになります:CVector CVector :: operator +(CVector param){ CVector temp; temp.x = x + param.x; temp.y = y + param.y; return(temp); } – fso

関連する問題