1 回答

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
#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);//默認(rèn)構(gòu)造函數(shù)
Matrix(const Matrix & mt);//復(fù)制構(gòu)造函數(shù)
~Matrix();//析構(gòu)函數(shù)
//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<<"請(qǐng)輸入第"<<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<<"內(nèi)存空間不足!"<<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;
}
注:由于我的編譯器的問(wèn)題,模板類(lèi)的實(shí)現(xiàn)文件不能包含在project里,所以另行定義,我已經(jīng)將友元形式全部注掉,在main函數(shù)里測(cè)試的是模板內(nèi)重載的操作符,通過(guò)編譯,C++規(guī)定,在類(lèi)內(nèi)重載操作符,形參表內(nèi)至少要包含一個(gè)該類(lèi)型的對(duì)象
添加回答
舉報(bào)