矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急

时间:2021-02-23 14:08:26
//矩阵类:用一维数组表示
#include <iostream>

using namespace std;

template<class T>
class Matrix
{
public:
    Matrix(int row=0,int cols=0);//构造函数
    Matrix(const Matrix<T>&);//复制构造函数
    ~Matrix(){delete []element;}//析构函数

    int row(){return therow;}
    int clos(){return thecolumns;}
    T&operator()(int i,int j)const;

    //重载运算符
    friend ostream& operator<<(ostream& out,const Matrix<T>&m)
    {
    int i=0,j=0;
  while(j<=(m.thecolumns*m.therow)-1)
  {
      i++;
      out<<m.element[j]<<" ";
      if(i==m.thecolumns)
      {
          out<<endl;
          i=0;
      }
      j++;
  }
  return out;

     }
    Matrix<T>& operator=(const Matrix<T>&);//复制函数
    /*T& operator()(int i,int j){return this->element[i][j];}//赋值,二位数组*/
    T&operator()(int i,int j){return this->element[(i-1)*this->thecolumns+(j-1)];}//重载()
    Matrix<T> operator+(const Matrix<T> m)const;//

private :
    int therow;//矩阵行数
    int thecolumns;//矩阵列数
    //T **element;//用二维数组存放矩阵
    T *element;//用一维数组存放
};
template<class T>
Matrix<T>::Matrix(int row,int cols)//创建矩阵
{
    this->therow=row;
    this->thecolumns=cols;
    this->element=new T[(this->therow)*(this->thecolumns)];//分配行
}
template<class T>
Matrix<T>::Matrix(const Matrix<T> &m)//复制构造函数
{
     this->therow=m.therow;
    this->thecolumns=m.thecolumns;
    this->element=new T[this->therow*this->thecolumns];//分配行
    for(int i=0;i<=this->therow*this->thecolumns+1;i++)
        this->element[i]=m.element[i];

}
template<class T>
Matrix<T>& Matrix<T>::operator=(const Matrix<T>&m)
{
    for(int i=0;i<=m.thecolumns*m.therow-1;i++)
        this->element[i]=m.element[i];
    return *this;
}
//debug
template<class T>
Matrix<T> Matrix<T>::operator+(const Matrix<T> m)const
{
     Matrix<T> w(m.therow,m.thecolumns);//生成结果矩阵
     for(int i=0;i<m.thecolumns*m.therow;i++)
     {
      w.element[i]=this->element[i]+m.element[i];
      cout<<i<<endl;
     }
     cout<<"i"<<endl;
     return w;//debug*******调用此函数时,好像执行不到这一句
}
int main()
{
    Matrix<int> m(2,2),h(2,2);
    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
        cin>>m(i,j);
    h=m+m;//******************
    cout <<"1"<<endl;//**********************执行不到这一句
    return 0;
}

7 个解决方案

#1


矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急理解讨论之前请先学会如何 观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他! 矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

#2


再你程序最后加上getchar();,就可以了

#3


getchar()这个函数是干嘛的?

#4


复制构造函数里内存越界:for(int i=0;i<=this->therow*this->thecolumns +1;i++)
对于这种基础数组索引操作,自己的风格都不统一,不晕?要么i=0;i<size;要么i=0;i<=size-1;一下子<,一下子<=搞什么。

另外:赋值重载里有内存泄露,赋值前没有释放原有内存。

#5


我跑没问题啊,LLVM6.1, os x

#6


引用 3 楼 qq_33334350 的回复:
getchar()这个函数是干嘛的?


等待接收一个字符,否则程序执行完就结束了

#7


谢谢,真的谢谢你。复制构造函数的问题改了,然后整个程序就好了。但是您说的第二点我不太懂,是重载=的函数里的内存泄露么?数组不能直接附值么?我是一名大二的编程爱好者,不是计算机方面的学生,我可以加您qq么,想和您请教一下如何能更高校的学习软件编程。

#1


矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急理解讨论之前请先学会如何 观察

计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他! 矩阵类,重载+这个函数有点问题,小弟求大神指导一下,急急

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

#2


再你程序最后加上getchar();,就可以了

#3


getchar()这个函数是干嘛的?

#4


复制构造函数里内存越界:for(int i=0;i<=this->therow*this->thecolumns +1;i++)
对于这种基础数组索引操作,自己的风格都不统一,不晕?要么i=0;i<size;要么i=0;i<=size-1;一下子<,一下子<=搞什么。

另外:赋值重载里有内存泄露,赋值前没有释放原有内存。

#5


我跑没问题啊,LLVM6.1, os x

#6


引用 3 楼 qq_33334350 的回复:
getchar()这个函数是干嘛的?


等待接收一个字符,否则程序执行完就结束了

#7


谢谢,真的谢谢你。复制构造函数的问题改了,然后整个程序就好了。但是您说的第二点我不太懂,是重载=的函数里的内存泄露么?数组不能直接附值么?我是一名大二的编程爱好者,不是计算机方面的学生,我可以加您qq么,想和您请教一下如何能更高校的学习软件编程。