本文共 1521 字,大约阅读时间需要 5 分钟。
#pragma once#includeclass Matrix { public: Matrix(); /* *释放内存空间 */ ~Matrix(); /* @array:一个二维数组 @rows_in:array的行数 @cols_in:array的列数 */ Matrix( int rows_in, int cols_in, const float* array = NULL); /* *根据传进来的matirx新建一个Matrix */ Matrix(Matrix& matrix); /* *设置矩阵某个位置的元素 @row:哪一行 @col:那一列 @value:元素值 */ void setElement(int row, int col, float value); /* *返回矩阵的列数 */ int getCols()const; /* *返回矩阵的行数 */ int getRows()const; /* *求矩阵的行列式 */ float det(); /* *求矩阵的逆 */ //float* inverse(); /* *重载=号 */ void operator=(Matrix matrix_in); /* *重载*号 */ Matrix operator*(Matrix& matrix_in); /* *重置,释放矩阵空间 */ void reset(); /* @打印出矩阵 */ void printMatrix();private: float** elements; int cols; int rows; float detSub(Matrix &matrix);};
然后我实现了这里面的函数,没有逻辑错误。
在我测试的时候用了下面的程序:
正如图片所示,说没有适当的构造函数。我各种改,改了*重载返回结果为Matrix&
,我知道这样返回出来的是一个野指针,我只是抱着侥幸的心态去试试,当然是出错了。改到最后,没招了。
开始怀疑人生,不对,是开始怀疑自己是不是对运算符重载有误解啊,然后上了某慕课平台,找了某顶尖高校的c++程序设计课程来看符号重载部分内容。但是这个看只不过验证了我对其理解没有错误。不过也是有收获的,看人家非常严谨,代码有很多const,我也学一下,毕竟这是个不错的习惯嘛,
然后就在一些应该加的地方加了一些const.
改完。我随手运行了一下,看有没有改出毛病来。一运行,哎!,程序竟然正常运行了。真是迷啊,我到底改了啥,他怎么就突然正常了。
当然,作为一个强迫症者,肯定不会就这样过去了,然后我又ctrl+z,回到解放前。一步一步来看,Matrix( Matrix& matrix);
改成Matrix(const Matrix& matrix);
,就正常了。
分析下原因: 在执行完matrix2=(matrix * matrix1);
这句时,matrix * matrix1
结束后返回的是一个临时对象,而这里主函数调用复制构造函数Matrix( Matrix& matrix);
新建一个对象来保存运算结果,就在新建这个临时对象的时候出问题了,因为*返回出来的对象是const的,而我这里传进复制构造函数的对象不是const的,所以出问题了。
非常感谢这位朋友,给出另外的答案
文章仅代表个人见解,若有错误,欢迎各位朋友批评指正!
转载地址:http://mrftb.baihongyu.com/