ответ
#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;
}
Некоторые разное примечания:
- это очень плохо, что вы используете
malloc
против изnew
.Real
может быть POD только для того, чтобы позволитьvector
хорошо работать в вашем случае. Используйтеnew
или создайте пользовательскую политику создания, если вы считаете, чтоmalloc
обеспечивает лучшую производительность на POD. Также не забудьте использоватьdelete []
вместоfree
при уничтожении буфера памяти. - Это лучше выполнить проверку границ во время перегрузки
operator[]
- для лучшего использования производительности
++i
вместо формы постфикса. В прежнем временном значении не создается.
Большое спасибо за ваши советы, но это оператор + = тело? Потому что операторы аффектации работают хорошо. – fso
Всего минуту. Я дам вам код. – DaddyM
(я не могу опубликовать asnwer, после чего я отправляю сюда) оператор + должен выглядеть (мне): CVector CVector :: operator + (CVector param) { CVector temp; temp.x = x + param.x; temp.y = y + param.y; return (temp); } – fso
Пожалуйста, можете ли вы сократить свой код до ** абсолютного минимума **, необходимого для выявления проблемы (см. Http://sscce.org). –
Вам нужно что-то, что компилируется? или ошибка может быть решена без? – fso