2011-12-26 4 views
1

См https://stackoverflow.com/questions/41810306/appointment-scheduling ....шаблона, наследование и операторы

+1

Пожалуйста, можете ли вы сократить свой код до ** абсолютного минимума **, необходимого для выявления проблемы (см. Http://sscce.org). –

+0

Вам нужно что-то, что компилируется? или ошибка может быть решена без? – fso

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^