为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只萌萌小番薯 2021-12-31 10:06:23
#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;}
查看完整描述

1 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

#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.cpp
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>//重载 = 操作符
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++规定,在类内重载操作符,形参表内至少要包含一个该类型的对象



查看完整回答
反对 回复 2022-01-03
  • 1 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号