尝试通过带有类模板的重载*运算符来实现矩阵乘法。代码适用于Windows中的CodeBlocks(带有一些警告),但是在Ubuntu中通过g ++进行编译时,它显示了一些问题。更多运行' ./的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:实例化'Matrix&amp; Matrix :: operator *(Matrix&amp;)[with T = int]': myProj.cpp:75:5:从这里需要 myProj.cpp:52:13:警告:引用本地变量'Q'返回[-Wreturn-local-addr] 矩阵Q(行,X.columns);
答案 0 :(得分:2)
局部变量或嵌套作用域中的变量一旦超出范围就会消失。例如,在operator*
函数中,您拥有局部变量Q
。从函数返回时,变量不再存在,Q
对象将被销毁。返回对它的引用将导致未定义的行为。
此处的问题实际上并未返回Q
,而是通过引用返回。解决方案是按值返回 。对于operator+
重载函数,它也是一样的,它也应该按值返回。
按值返回当然要求你遵循the rules of three, five or zero,你现在没有这样做,因为你没有任何赋值运算符,复制或移动构造函数,甚至是析构函数(最后一个)会导致内存泄漏)。