* 使用模板重载运算符 class
* operator overloading with template class
尝试通过使用 class 的重载 * 运算符实现矩阵乘法 templates.The 代码在 Windows 中的 CodeBlocks(带有一些警告)上工作,但在 [=22 中通过 g++ 编译时=] 它显示一些 issues.Furthurmore 运行 './a.out' 产生分段错误。
#include <iostream>
#define TOLERANCE 0.0001
using namespace std;
template <class T>class Matrix;
template <class T>ostream &operator<<(ostream &out,const Matrix<T>&);
//Matrix can be of any data type
template <class T> Matrix<T> &operator*( Matrix<T>&);
template <class T>
class Matrix{
private:
int rows,columns;
T **A;
public:
//Default Constructor
Matrix(){rows=0;columns=0;}
//Parameterised Constructor
Matrix(int Rows,int Cols){
rows=Rows;
columns=Cols;
A=new T*[rows];
for(int i=0; i<rows; i++)
A[i]=new T[columns];
}
void displayMatrix();
void fillMatrix(T x);
Matrix<T>& operator* ( Matrix<T> &X);//Matrix Multiply
friend ostream &operator<< <T>(ostream &out ,const Matrix<T> &X);
};
template <class T>
void Matrix<T>::displayMatrix(){
for(int i=0;i<rows ;i++ ){
for(int j=0 ;j<columns ;j++ )
cout<<A[i][j]<<" ";
cout<<endl;
}
}
template <class T>
void Matrix<T>::fillMatrix(T x){
for(int i=0; i<rows; i++)
for(int j=0; j<columns; j++)
A[i][j]=x;
}
template <class T>
Matrix<T> &Matrix<T>::operator*( Matrix<T> &X){
T sum=0;
if(columns=X.rows){
Matrix<T> Q(rows,X.columns);
for(int i=0; i<rows ;i++){
for(int j=0; j<X.columns; j++){
for(int k=0 ;k<columns ;k++ )
sum+=A[i][k]*(X.A[k][j]);
Q.A[i][j]=sum;
sum=0;
}
}
return Q;
}else{
cout<<"Something's wrong!";
return *this;
}
}
int main(){
Matrix<double> x,y,z;
x.fillMatrix(1.2);
y.fillMatrix(2.3);
z=x*y;
z.displayMatrix();
return 0;
}
我想在cpp中实现广义模板的矩阵乘法。
这会产生以下结果:
myProj.cpp: In instantiation of ‘Matrix& Matrix::operator*(Matrix&) [with T = int]’:
myProj.cpp:75:5: required from here
myProj.cpp:52:13: warning: reference to local variable ‘Q’ returned [-Wreturn-local-addr]
Matrix Q(rows,X.columns);
局部变量或嵌套作用域中的变量一旦超出作用域就会消失。例如,在您的 operator*
函数中,您有局部变量 Q
。当你从函数中 return 时,变量不再存在,并且 Q
对象将被破坏。返回对它的引用将导致未定义的行为。
这里的问题实际上不是 returning Q
,而是你 return 通过引用 。解决方法是returnby value。 operator+
重载函数也是一样,按值也应该是return。
按值返回当然需要您遵循 the rules of three, five or zero,您现在不需要这样做,因为您没有任何赋值运算符、复制或移动构造函数,甚至没有析构函数(最后会导致内存泄漏)。
尝试通过使用 class 的重载 * 运算符实现矩阵乘法 templates.The 代码在 Windows 中的 CodeBlocks(带有一些警告)上工作,但在 [=22 中通过 g++ 编译时=] 它显示一些 issues.Furthurmore 运行 './a.out' 产生分段错误。
#include <iostream>
#define TOLERANCE 0.0001
using namespace std;
template <class T>class Matrix;
template <class T>ostream &operator<<(ostream &out,const Matrix<T>&);
//Matrix can be of any data type
template <class T> Matrix<T> &operator*( Matrix<T>&);
template <class T>
class Matrix{
private:
int rows,columns;
T **A;
public:
//Default Constructor
Matrix(){rows=0;columns=0;}
//Parameterised Constructor
Matrix(int Rows,int Cols){
rows=Rows;
columns=Cols;
A=new T*[rows];
for(int i=0; i<rows; i++)
A[i]=new T[columns];
}
void displayMatrix();
void fillMatrix(T x);
Matrix<T>& operator* ( Matrix<T> &X);//Matrix Multiply
friend ostream &operator<< <T>(ostream &out ,const Matrix<T> &X);
};
template <class T>
void Matrix<T>::displayMatrix(){
for(int i=0;i<rows ;i++ ){
for(int j=0 ;j<columns ;j++ )
cout<<A[i][j]<<" ";
cout<<endl;
}
}
template <class T>
void Matrix<T>::fillMatrix(T x){
for(int i=0; i<rows; i++)
for(int j=0; j<columns; j++)
A[i][j]=x;
}
template <class T>
Matrix<T> &Matrix<T>::operator*( Matrix<T> &X){
T sum=0;
if(columns=X.rows){
Matrix<T> Q(rows,X.columns);
for(int i=0; i<rows ;i++){
for(int j=0; j<X.columns; j++){
for(int k=0 ;k<columns ;k++ )
sum+=A[i][k]*(X.A[k][j]);
Q.A[i][j]=sum;
sum=0;
}
}
return Q;
}else{
cout<<"Something's wrong!";
return *this;
}
}
int main(){
Matrix<double> x,y,z;
x.fillMatrix(1.2);
y.fillMatrix(2.3);
z=x*y;
z.displayMatrix();
return 0;
}
我想在cpp中实现广义模板的矩阵乘法。 这会产生以下结果:
myProj.cpp: In instantiation of ‘Matrix& Matrix::operator*(Matrix&) [with T = int]’: myProj.cpp:75:5: required from here myProj.cpp:52:13: warning: reference to local variable ‘Q’ returned [-Wreturn-local-addr] Matrix Q(rows,X.columns);
局部变量或嵌套作用域中的变量一旦超出作用域就会消失。例如,在您的 operator*
函数中,您有局部变量 Q
。当你从函数中 return 时,变量不再存在,并且 Q
对象将被破坏。返回对它的引用将导致未定义的行为。
这里的问题实际上不是 returning Q
,而是你 return 通过引用 。解决方法是returnby value。 operator+
重载函数也是一样,按值也应该是return。
按值返回当然需要您遵循 the rules of three, five or zero,您现在不需要这样做,因为您没有任何赋值运算符、复制或移动构造函数,甚至没有析构函数(最后会导致内存泄漏)。