【c++】=重载,报错:没有合适的复制构造函数

  • 不想看太多的朋友看这句就行了:在你的复制构造函数作为参数传进去的那个对象前加个const.
  • 是这样的,在写机器学习作业的时候,遇到了很多矩阵算法,为了处理上的方便,我写了一个矩阵类Matrix,如下:
#pragma once
#include <iostream>

class 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的,所以出问题了。

  • 非常感谢这位朋友,给出另外的答案
    在这里插入图片描述

  • 文章仅代表个人见解,若有错误,欢迎各位朋友批评指正!

评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值