博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【c++】=重载,报错:没有合适的复制构造函数
阅读量:2355 次
发布时间:2019-05-10

本文共 1521 字,大约阅读时间需要 5 分钟。

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

  • 非常感谢这位朋友,给出另外的答案

    在这里插入图片描述

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

转载地址:http://mrftb.baihongyu.com/

你可能感兴趣的文章
细说VLAN与Trunk
查看>>
交换机上的三种端口模式
查看>>
关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系
查看>>
CURL常用命令
查看>>
OWASP 2013年十大热门威胁及应对工具
查看>>
DNS记录类型介绍(A记录、MX记录、NS记录等)
查看>>
(总结)Nginx/LVS/HAProxy负载均衡软件的优缺点详解
查看>>
Google Maglev 牛逼的网络负载均衡器
查看>>
负载均衡原理与技术实现
查看>>
Maglev
查看>>
GoF的23个经典设计模式
查看>>
B+树与LSM树的区别与联系
查看>>
NAPT和NAT的工作原理及其区别
查看>>
interface f0/0与interface serial0/0的区别
查看>>
KDD CUP 1999数据集
查看>>
安全领域中的TTP是什么意思 结合APT-C1案例给大家讲讲三要素
查看>>
基于Hadoop的大数据平台实施记——整体架构设计
查看>>
iSCSI存储连接的几种方式
查看>>
深入浅出SOA
查看>>
用 Python、 RabbitMQ 和 Nameko 实现微服务
查看>>