#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执行停在该断点处的时候。
计算机组成原理→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;一下子<,一下子<=搞什么。
另外:赋值重载里有内存泄露,赋值前没有释放原有内存。
对于这种基础数组索引操作,自己的风格都不统一,不晕?要么i=0;i<size;要么i=0;i<=size-1;一下子<,一下子<=搞什么。
另外:赋值重载里有内存泄露,赋值前没有释放原有内存。
#5
我跑没问题啊,LLVM6.1, os x
#6
等待接收一个字符,否则程序执行完就结束了
#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执行停在该断点处的时候。
计算机组成原理→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;一下子<,一下子<=搞什么。
另外:赋值重载里有内存泄露,赋值前没有释放原有内存。
对于这种基础数组索引操作,自己的风格都不统一,不晕?要么i=0;i<size;要么i=0;i<=size-1;一下子<,一下子<=搞什么。
另外:赋值重载里有内存泄露,赋值前没有释放原有内存。
#5
我跑没问题啊,LLVM6.1, os x
#6
等待接收一个字符,否则程序执行完就结束了
#7
谢谢,真的谢谢你。复制构造函数的问题改了,然后整个程序就好了。但是您说的第二点我不太懂,是重载=的函数里的内存泄露么?数组不能直接附值么?我是一名大二的编程爱好者,不是计算机方面的学生,我可以加您qq么,想和您请教一下如何能更高校的学习软件编程。