搜索
bottom↓
回复: 11

【求助帖】C++关于后置++重载 出现报错

[复制链接]

出0入4汤圆

发表于 2020-10-8 23:26:09 | 显示全部楼层 |阅读模式
额 想学下C++ 然后看到那个++运算符重载的时候发现  前置++重载能实现cout 出来 后置++ cout << 的时候呢 就直接报错了 关键是不知道怎么解决  源代码如下 求坛内大佬给个解释。。。
  1. #include <iostream>
  2. using namespace std;
  3. class myoperator
  4. {
  5.         friend ostream& operator<<(ostream& cout, myoperator& p1);
  6. public:
  7.         int m_a;
  8.         myoperator(int a) :m_a(a) {};
  9.         myoperator& operator++();
  10.         myoperator operator++(int);
  11. };
  12. ostream& operator<<(ostream& cout, myoperator& p1)
  13. {
  14.         cout << "m_a = " << p1.m_a;
  15.         return cout;
  16. }
  17. myoperator& myoperator::operator++()
  18. {
  19.         this->m_a++;
  20.         return *this;
  21. }
  22. myoperator myoperator::operator++(int)
  23. {
  24.         myoperator tmp = *this;
  25.         ++this->m_a;
  26.         return tmp;
  27. }
  28. void test01()
  29. {
  30.         myoperator p1(1);
  31.         cout << ++p1 << endl;
  32.         cout << p1++ << endl;   //这句话错误  //错误E0349        没有与这些操作数匹配的 "<<" 运算符
  33. }
  34. int main(void)
  35. {
  36.         test01();
  37.         system("pause");
  38.         return EXIT_SUCCESS;
  39. }
复制代码




出0入4汤圆

 楼主| 发表于 2020-10-8 23:28:11 | 显示全部楼层
        p1++;
        cout << p1 << endl;
这样输出是可以的 但是cout << p1++ << endl; 这样就报错了 是不是我<< 重载 错了。。。但是我那个 cout << ++p1 << endl; 又没有问题。。。好奇怪 。。。
有点菜。。

出0入442汤圆

发表于 2020-10-8 23:41:30 来自手机 | 显示全部楼层
你放这里面估计没几个人能回答了。通常大家会把变量增减单独放外面---cout之类仅作为调试打印接口。

出0入4汤圆

 楼主| 发表于 2020-10-8 23:51:24 | 显示全部楼层
wye11083 发表于 2020-10-8 23:41
你放这里面估计没几个人能回答了。通常大家会把变量增减单独放外面---cout之类仅作为调试打印接口。 ...

++p1; p1++ 都可以在这段代码实现重载的把。。但是cout 的时候 p1++返回就出错了 。但是我看到的示例代码也是这么做的。。。就不知道怎么整了。。

出0入442汤圆

发表于 2020-10-8 23:55:25 来自手机 | 显示全部楼层
kyq_linux 发表于 2020-10-8 23:51
++p1; p1++ 都可以在这段代码实现重载的把。。但是cout 的时候 p1++返回就出错了 。但是我看到的示例代码 ...

那就甭纠结了,因为一般没人这么用。。只有那些自以为很牛x的,其实在某个方面确实很吊的人才会去炫某项特长,比如我看过一个exe用的纯winapi,里面没有任何物理上的函数调用,只有一个个的函数碎片,然后各种message满天飞。事实上,注重可重用性,以及代码可读性的人是不可能写这种代码的。

出0入4汤圆

 楼主| 发表于 2020-10-9 00:01:58 | 显示全部楼层
wye11083 发表于 2020-10-8 23:55
那就甭纠结了,因为一般没人这么用。。只有那些自以为很牛x的,其实在某个方面确实很吊的人才会去炫某项 ...

好的吧,之前一直都是用C  想玩下C++就自己网上找资料看一看语法,自己写一写demo 试试自己能不能玩。。哈哈

出0入8汤圆

发表于 2020-10-9 00:30:50 | 显示全部楼层
ostream& operator<<(ostream& cout, myoperator& p1)
只接受引用,需要实例已构造。
ostream& operator<<(ostream& cout, myoperator p1)
改成这样实例和引用都可以。至于内部原理,大概是语言的性能优化考虑。

出0入4汤圆

 楼主| 发表于 2020-10-9 01:04:40 | 显示全部楼层


。。。。好像可以用了。。。。

出0入8汤圆

发表于 2020-10-9 09:47:55 来自手机 | 显示全部楼层
本帖最后由 canspider 于 2020-10-9 09:50 编辑

你的第二个operator++返回了一个临时变量,这个在C++里面是一个右值(简单来说就是只能放在=号右边)
而你重载的<<操作符号第二个参数是一个非const的引用,非const的引用需要一个左值(可以放在=号左边,可以赋值)来初始化,因此报错
解决办法很简单,把你重载的<<符号第二个参数加上const修饰即可。加了const修饰的引用可以用右值来初始化

出0入8汤圆

发表于 2020-10-9 14:59:43 | 显示全部楼层
canspider 发表于 2020-10-9 09:47
你的第二个operator++返回了一个临时变量,这个在C++里面是一个右值(简单来说就是只能放在=号右边)
而你 ...

仰望加膜拜大牛权威解释~谢谢分享知识!

出0入4汤圆

 楼主| 发表于 2020-10-9 20:02:41 | 显示全部楼层
本帖最后由 kyq_linux 于 2020-10-9 21:38 编辑
canspider 发表于 2020-10-9 09:47
你的第二个operator++返回了一个临时变量,这个在C++里面是一个右值(简单来说就是只能放在=号右边)
而你 ...


好像不太好使

出0入0汤圆

发表于 2020-10-10 17:03:53 | 显示全部楼层
本帖最后由 hitgds 于 2020-10-10 17:06 编辑

myoperator myoperator::operator++(int) 返回的是一个临时变量,是一个纯右值(将亡值),纯右值只能绑定到常左值引用(const myoperator&)或者右值引用(myoperator&&)
加一个 friend ostream& operator<<(ostream& cout, const myoperator& p1); 或者 friend ostream& operator<<(ostream& cout, myoperator&& p1);就可以了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 19:42

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表