Шаблон, наследование и операторы - PullRequest

1 Ответ

1 голос
/ 26 декабря 2011
#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. очень плохо, что вы используете malloc против new.Real может быть POD только для того, чтобы vector хорошо работал в вашем случае.Используйте new или предоставьте собственную политику создания, если считаете, что malloc обеспечивает лучшую производительность для POD.Также не забудьте использовать delete [] вместо free при уничтожении буфера памяти.
  2. Лучше выполнять проверку границ при перегрузке operator[]
  3. для повышения производительности, используйте вместо этого ++iпостфиксной формы.В первом случае временное значение не создается.
...