求指教模板 +和+=运算符重载的问题,具体内容如下~

#define MATRIX_H
#include<iostream>
using namespace std;
template <typename T>
class Matrix{
template <typename T>
friend ostream & operator<<(ostream & os,const Matrix<T> & ma);
template <typename T>
friend istream & operator>>(istream & is,Matrix<T> & ma);
public:
Matrix(int x=0,int y=0);
Matrix(const Matrix & mt);
~Matrix();
friend Matrix<T> operator + (Matrix<T> & mt1,Matrix<T> & mt2);
friend Matrix<T> & operator += (Matrix<T> & mt1,Matrix<T> & mt2);
Matrix operator = ( Matrix<T> & mt);
/*
operator+
operator+=
operator=
*/
private:
int m,n;
T * * ptr;
};
template <typename T>
Matrix<T>::Matrix(int x,int y){
m=x,n=y;
ptr=new T *[m];
for(int i=0;i<m;i++)
ptr[i]=new T[n];
if(ptr==NULL){
cout<<"内存空间不足!"<<endl;
exit(-1);
}
}
template <typename T>
Matrix<T>::Matrix(const Matrix & mt){
m=mt.m;
n=mt.n;
ptr=new T *[m];
for(int i=0;i<m;i++)
ptr[i]=new T[n];

for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
ptr[i][j]=mt.ptr[i][j];
}
template <typename T>
Matrix<T>::~Matrix(){
for(int i=0;i<m;i++)
delete [] ptr[i];
delete [] ptr;
}
template <typename T>
ostream & operator<<(ostream & os,const Matrix<T> & ma){
for(int i=0;i<ma.m;i++){
for(int j=0;j<ma.n;j++)
os<<ma.ptr[i][j]<<"\t";
os<<endl;
}
return os;
}
template <typename T>
istream & operator>>(istream & is,Matrix<T> & ma){
for(int i=0;i<ma.m;i++){
cout<<"请输入第"<<i+1<<"行"<<ma.n<<"元素:";
for(int j=0;j<ma.n;j++)
is>>ma.ptr[i][j];
}
return is;
}
template <typename T>
Matrix<T> operator + (Matrix<T> & mt1,Matrix<T> & mt2)
{
Matrix tmp[i][j];
for(int i=0;i<mt.m;i++)
for(int j=0;j<mt.n;j++)
tmp[i][j]=mt1.ptr[i][j]+mt2.ptr[i][j];
return tmp[i][j];
}
template <typename T>
Matrix<T> & operator += (Matrix<T> & mt1,Matrix<T> & mt2)
{
for(int i=0;i<mt.m;i++)
for(int j=0;j<mt.n;j++)
mt1.ptr[i][j]+=mt2.ptr[i][j];
return mt1.ptr[i][j];
}
template <typename T>
Matrix<T> Matrix<T>::operator = ( Matrix<T> & mt)
{
m=mt.m;
n=mt.n;
for(int i=0;i<mt.m;i++)
for(int j=0;j<mt.n;j++)
ptr[i][j]=mt.ptr[i][j];
return *this;
}

一只萌萌小番薯
浏览 182回答 1
1回答

精慕HU

#include <cstdlib>#include<iostream>using namespace std;template <typename T>class Matrix{template <typename T>friend ostream & operator<<(ostream & os,const Matrix<T> & ma);//输出template <typename T>friend istream & operator>>(istream & is,Matrix<T> & ma);//输入public:Matrix(int x=0,int y=0);//默认构造函数Matrix(const Matrix & mt);//复制构造函数~Matrix();//析构函数//friend Matrix<T>& operator + (Matrix<T> & mt1,Matrix<T> & mt2);//友元形式+操作符//friend Matrix<T>& operator += (Matrix<T> & mt1,Matrix<T> & mt2);//友元形式+=操作符Matrix& operator = (const Matrix<T>& mt);//重载赋值操作符Matrix& operator +(const Matrix<T>& mt);//重载+操作符Matrix& operator +=(const Matrix<T>& mt);//重载+=操作符private:int m,n;T **ptr;};#include "dw.cpp"template <typename T>ostream & operator<<(ostream & os,const Matrix<T> & ma){for(int i=0;i<ma.m;i++){for(int j=0;j<ma.n;j++)os<<ma.ptr[i][j]<<"\t";os<<endl;}return os;}template <typename T>istream & operator>>(istream & is,Matrix<T> & ma){for(int i=0;i<ma.m;i++){cout<<"请输入第"<<i+1<<"行"<<ma.n<<"元素:";for(int j=0;j<ma.n;j++)is>>ma.ptr[i][j];}return is;}/*template <typename T>//友元形式+操作符Matrix<T> operator + (Matrix<T> & mt1,Matrix<T> & mt2){Matrix tmp[i][j];for(int i=0;i<mt.m;i++)for(int j=0;j<mt.n;j++)tmp[i][j]=mt1.ptr[i][j]+mt2.ptr[i][j];return tmp[i][j];}template <typename T>//友元形式+=操作符Matrix<T> & operator += (Matrix<T> & mt1,Matrix<T> & mt2){for(int i=0;i<mt.m;i++)for(int j=0;j<mt.n;j++)mt1.ptr[i][j]+=mt2.ptr[i][j];return mt1.ptr[i][j];}*/int main(){Matrix<int> am,bm;bm = am;bm = am + bm;bm += am;return 0;}//dw.cpptemplate <typename T>Matrix<T>::Matrix(int x,int y){m=x,n=y;ptr=new T* [m];for(int i=0;i<m;i++)ptr[i]=new T[n];if(ptr==NULL){cout<<"内存空间不足!"<<endl;exit(-1);}}template <typename T>Matrix<T>::Matrix(const Matrix & mt){m=mt.m;n=mt.n;ptr=new T *[m];for(int i=0;i<m;i++)ptr[i]=new T[n];for(int i=0;i<m;i++)for(int j=0;j<n;j++)ptr[i][j]=mt.ptr[i][j];}template <typename T>Matrix<T>::~Matrix(){for(int i=0;i<m;i++)delete [] ptr[i];delete [] ptr;}template <typename T>//重载 = 操作符Matrix<T>& Matrix<T>::operator = (const Matrix<T>& mt){m=mt.m;n=mt.n;for(int i=0;i<mt.m;i++)for(int j=0;j<mt.n;j++)ptr[i][j]=mt.ptr[i][j];return *this;}template<typename T>//重载+操作符Matrix<T>& Matrix<T>::operator +(const Matrix<T>& mt){for(int i=0;i<m;i++)for(int j=0;j<n;j++)ptr[i][j]=ptr[i][j]+mt.ptr[i][j];return *this;}template<typename T>//重载+=操作符Matrix<T>& Matrix<T>::operator+= (const Matrix<T>& mt){*this = *this + mt;return *this;}注:由于我的编译器的问题,模板类的实现文件不能包含在project里,所以另行定义,我已经将友元形式全部注掉,在main函数里测试的是模板内重载的操作符,通过编译,C++规定,在类内重载操作符,形参表内至少要包含一个该类型的对象
打开App,查看更多内容
随时随地看视频慕课网APP