矩阵模板加法运算符重载
Matrix template addition operator overloading
我的任务是编写具有某些特定功能的模板矩阵 class。我认为 operator=
、copy constructor
和 parameter constructor
工作正常。
operator+
有问题。例如,当我添加 2 个仅填充数字 5 的矩阵时,我在整个 row 1
和整个 column m
中得到了奇怪的数字,最后一行没有元素。类似的东西(o - 好的,x - 错误的结果)。
xxxx
ooox
ooox
oooo
头文件
template <typename T> class Matrix {
int n, m; //dimensions
T** arr;
public:
Matrix();
Matrix(int row, int column, const T& value);
Matrix(const Matrix<T>& copy);
~Matrix();
void init(int row, int column, T** ar);
template <typename O>
friend std::ostream& operator<<(std::ostream& out, const Matrix<O>& t);
Matrix<T>& operator=(const Matrix<T>& rhs);
Matrix<T>& operator+=(const Matrix<T>& rhs);
Matrix<T>& operator+(const Matrix<T>& rhs);
};
cpp 文件
template <typename T>
void Matrix<T>::init(int row, int column, T** a) {
n = row;
m = column;
arr = new int *[n];
for (unsigned i = 0; i < n; i++)
arr[i] = new int[m];
if (a) {
for (unsigned i = 0; i < n; i++)
for (unsigned j = 0; j < m; j++)
arr[i][j] = a[i][j];
}
}
template <typename T>
Matrix<T>::Matrix() {
init(2,2, arr);
}
template <typename T>
Matrix<T>::Matrix(int row, int column, const T& value) {
n = row;
m = column;
arr = new int *[n];
for (unsigned i=0; i < n; i++)
arr[i] = new int[m];
for(unsigned i=0; i<n; i++)
for(unsigned j=0; j<m; j++)
arr[i][j] = value;
}
template <typename T>
Matrix<T>::Matrix(const Matrix<T>& mat_copy) {
n = mat_copy.n;
m = mat_copy.m;
init(mat_copy.n, mat_copy.m, mat_copy.arr);
}
template <typename T>
Matrix<T>::~Matrix() {
for(unsigned i=0; i<n; i++)
delete[] arr[i];
delete[] arr;
}
template <typename T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T>& T1) {
if(this == &T1) return *this;
for(unsigned i=0; i<n; i++)
delete [] arr[i];
delete [] arr;
init(T1.n, T1.m, T1.arr);
return *this;
}
template <typename T>
std::ostream& operator<<(std::ostream& out, const Matrix<T>& t) {
for(unsigned i=0; i<t.n; i++) {
std::cout << std::endl;
for(unsigned j=0; j<t.n; j++)
out << t.arr[i][j] << " ";
}
std::cout << std::endl;
return out;
}
template <typename T>
Matrix<T>& Matrix<T>::operator+(const Matrix<T>& rhs) {
int rows = n;
int columns = m;
Matrix result(rows,columns,0);
for (unsigned i = 0; i < rows; i++)
for (unsigned j = 0; j < columns; j++)
result.arr[i][j] = (*this).arr[i][j] + rhs.arr[i][j];
return result;
}
有什么解决办法吗?如果您能提供改进方面的帮助和建议,我将不胜感激,因为可能会有一些错误。
我使用最新的 CLion 版本和更新的 cygwin 编译器。
几条评论:
1)(可能是你问题的根源),operator<<
方法中j
迭代器的上界错误,应该是:
for(unsigned j=0; j<t.m; j++)
2) 构造函数 Matrix<T>(int row, int column, const T& value)
应该调用 init
方法而不是重新实现它。
3) init
应该是私有的
4) 提供创建 2x2 矩阵的默认构造函数是没有意义的!默认构造函数应该创建一个空矩阵 0x0!
5) 在对矩阵求和之前,你应该检查它们是否兼容这样的操作。
6) 我希望你不是在寻找性能,因为你在内存中放置矩阵的方式对缓存不友好而且不会很快!
我怀疑问题是由 operator+()
函数的 return 值引起的。您正在 return 引用函数的局部对象。
template <typename T>
Matrix<T>& Matrix<T>::operator+(const Matrix<T>& rhs) {
int rows = n;
int columns = m;
Matrix result(rows,columns,0);
for (unsigned i = 0; i < rows; i++)
for (unsigned j = 0; j < columns; j++)
result.arr[i][j] = (*this).arr[i][j] + rhs.arr[i][j];
// Returning a reference to a function local object.
// The reference will be a dangling reference when the function returns.
return result;
}
将 return 类型更改为对象。
template <typename T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& rhs) {
int rows = n;
int columns = m;
Matrix result(rows,columns,0);
for (unsigned i = 0; i < rows; i++)
for (unsigned j = 0; j < columns; j++)
result.arr[i][j] = (*this).arr[i][j] + rhs.arr[i][j];
return result;
}
我的任务是编写具有某些特定功能的模板矩阵 class。我认为 operator=
、copy constructor
和 parameter constructor
工作正常。
operator+
有问题。例如,当我添加 2 个仅填充数字 5 的矩阵时,我在整个 row 1
和整个 column m
中得到了奇怪的数字,最后一行没有元素。类似的东西(o - 好的,x - 错误的结果)。
xxxx
ooox
ooox
oooo
头文件
template <typename T> class Matrix {
int n, m; //dimensions
T** arr;
public:
Matrix();
Matrix(int row, int column, const T& value);
Matrix(const Matrix<T>& copy);
~Matrix();
void init(int row, int column, T** ar);
template <typename O>
friend std::ostream& operator<<(std::ostream& out, const Matrix<O>& t);
Matrix<T>& operator=(const Matrix<T>& rhs);
Matrix<T>& operator+=(const Matrix<T>& rhs);
Matrix<T>& operator+(const Matrix<T>& rhs);
};
cpp 文件
template <typename T>
void Matrix<T>::init(int row, int column, T** a) {
n = row;
m = column;
arr = new int *[n];
for (unsigned i = 0; i < n; i++)
arr[i] = new int[m];
if (a) {
for (unsigned i = 0; i < n; i++)
for (unsigned j = 0; j < m; j++)
arr[i][j] = a[i][j];
}
}
template <typename T>
Matrix<T>::Matrix() {
init(2,2, arr);
}
template <typename T>
Matrix<T>::Matrix(int row, int column, const T& value) {
n = row;
m = column;
arr = new int *[n];
for (unsigned i=0; i < n; i++)
arr[i] = new int[m];
for(unsigned i=0; i<n; i++)
for(unsigned j=0; j<m; j++)
arr[i][j] = value;
}
template <typename T>
Matrix<T>::Matrix(const Matrix<T>& mat_copy) {
n = mat_copy.n;
m = mat_copy.m;
init(mat_copy.n, mat_copy.m, mat_copy.arr);
}
template <typename T>
Matrix<T>::~Matrix() {
for(unsigned i=0; i<n; i++)
delete[] arr[i];
delete[] arr;
}
template <typename T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T>& T1) {
if(this == &T1) return *this;
for(unsigned i=0; i<n; i++)
delete [] arr[i];
delete [] arr;
init(T1.n, T1.m, T1.arr);
return *this;
}
template <typename T>
std::ostream& operator<<(std::ostream& out, const Matrix<T>& t) {
for(unsigned i=0; i<t.n; i++) {
std::cout << std::endl;
for(unsigned j=0; j<t.n; j++)
out << t.arr[i][j] << " ";
}
std::cout << std::endl;
return out;
}
template <typename T>
Matrix<T>& Matrix<T>::operator+(const Matrix<T>& rhs) {
int rows = n;
int columns = m;
Matrix result(rows,columns,0);
for (unsigned i = 0; i < rows; i++)
for (unsigned j = 0; j < columns; j++)
result.arr[i][j] = (*this).arr[i][j] + rhs.arr[i][j];
return result;
}
有什么解决办法吗?如果您能提供改进方面的帮助和建议,我将不胜感激,因为可能会有一些错误。
我使用最新的 CLion 版本和更新的 cygwin 编译器。
几条评论:
1)(可能是你问题的根源),operator<<
方法中j
迭代器的上界错误,应该是:
for(unsigned j=0; j<t.m; j++)
2) 构造函数 Matrix<T>(int row, int column, const T& value)
应该调用 init
方法而不是重新实现它。
3) init
应该是私有的
4) 提供创建 2x2 矩阵的默认构造函数是没有意义的!默认构造函数应该创建一个空矩阵 0x0!
5) 在对矩阵求和之前,你应该检查它们是否兼容这样的操作。
6) 我希望你不是在寻找性能,因为你在内存中放置矩阵的方式对缓存不友好而且不会很快!
我怀疑问题是由 operator+()
函数的 return 值引起的。您正在 return 引用函数的局部对象。
template <typename T>
Matrix<T>& Matrix<T>::operator+(const Matrix<T>& rhs) {
int rows = n;
int columns = m;
Matrix result(rows,columns,0);
for (unsigned i = 0; i < rows; i++)
for (unsigned j = 0; j < columns; j++)
result.arr[i][j] = (*this).arr[i][j] + rhs.arr[i][j];
// Returning a reference to a function local object.
// The reference will be a dangling reference when the function returns.
return result;
}
将 return 类型更改为对象。
template <typename T>
Matrix<T> Matrix<T>::operator+(const Matrix<T>& rhs) {
int rows = n;
int columns = m;
Matrix result(rows,columns,0);
for (unsigned i = 0; i < rows; i++)
for (unsigned j = 0; j < columns; j++)
result.arr[i][j] = (*this).arr[i][j] + rhs.arr[i][j];
return result;
}