Я реализую свой собственный класс матрицы в C ++, чтобы помочь мне развить мое понимание языка. Я где-то читал, что если у вас есть работающий оператор + =, используйте его в вашем операторе +. Вот что у меня есть:
template <class T>
const Matrix<T>& Matrix<T>::operator+(const Matrix<T> &R){
Matrix<T> copy(*this);
return copy += R;
}
А вот перегрузка оператора + =:
template <class T>
const Matrix<T>& Matrix<T>::operator+=(const Matrix<T> & second_matrix){
//Learn how to throw errors....
if (rows != second_matrix.getNumRows() || cols != second_matrix.getNumCols()){throw "Dimension mismatch.";}
int i,j;
for (i = 0; i < rows; i++){
for (j = 0; j < cols; j++){
data[i][j] += second_matrix.get(i,j);
}
}
return *this;
}
Я могу использовать + = просто отлично (например, a + = b; не возвращает ошибок). Но вызов оператора + (например, a = b + c;) возвращает:
test.cpp.out(77055) malloc: *** error for object 0x300000004: pointer being freed was not allocated
Просто для полноты вот мой деструктор:
template <class T>
Matrix<T>::~Matrix(){
for (int i = 1; i < rows; i++){
delete[] data[i]; }
delete[] data;
}
Я использую C ++ в течение нескольких лет, и у меня иногда возникают проблемы с отслеживанием указателей. Надеюсь это нормально ...
Любая помощь будет отличной. Спасибо!
РЕДАКТИРОВАТЬ: вот мой конструктор копирования. Это было установлено, чтобы освободить массивы данных, но я удалил это. теперь я получаю ошибки сегментации.
template <class T>
Matrix<T>::Matrix(const Matrix<T>& second_matrix){
rows = second_matrix.getNumRows();
cols = second_matrix.getNumCols();
data = new T*[rows];
int i,j;
for (i = 0; i < rows; i++){
data[i] = new T[cols];
}
for (i = 0; i < rows; i++){
for (j = 0; j < cols; j++){
data[i][j] = second_matrix.get(i,j);
}
}
}