鱼C论坛

 找回密码
 立即注册
查看: 2418|回复: 5

c++重载<<操作符和友缘问题。

[复制链接]
发表于 2019-7-3 15:22:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个对"<<"操作符进行重载,使其可以输出自定义的类中的元素的简单代码。                这段代码我有俩问题:

#include <iostream>
#include <string>

using namespace std;

class dio
{
public:
        dio(int a,int b)
        {
                real=a,imag=b;
        }
        friend ostream &operator<<(ostream &os,dio i);            //第一个问题在这,在这里我已经声明了友缘,但是还是报错说没权限访问private里面的元素。把dio类的“private:”去掉之后运行没问题。
private:
        int real;
        int imag;       
};
ostream &operator<<(ostream &os,dio i)                                      //第二个问题在这,这里为什么要加两个取地址符“&”呢?
{
        os<<i.real<<','<<i.imag<<endl;
        return os;
}

int main()
{
        dio jojo(1,3);
        cout<<jojo;
        return 0;
}

这是vc6的报错信息:

E:\C语言练习\liani73\73.cpp(20) : error C2248: 'real' : cannot access protected member declared in class 'dio'
        E:\C语言练习\liani73\73.cpp(15) : see declaration of 'real'
E:\C语言练习\liani73\73.cpp(20) : error C2248: 'imag' : cannot access protected member declared in class 'dio'
        E:\C语言练习\liani73\73.cpp(16) : see declaration of 'imag'
E:\C语言练习\liani73\73.cpp(27) : error C2593: 'operator <<' is ambiguous
执行 cl.exe 时出错.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-7-3 15:41:50 | 显示全部楼层
1 我也是在VC6.0测试的,估计与编译器有关,新版编译器可能不会出现这种问题(试验后反馈下哈)。
第一个问题很奇怪,但当我把这个函数体放进类里边的时候,一切都好了。
#include <iostream>
#include <string>

using namespace std;

class dio
{
public:
        dio(int a,int b)
        {
                real=a,imag=b;
        }
        friend ostream &operator<<(ostream &os,dio i)
        {
                os <<i.real<<','<<i.imag<<endl;
                return os;
        }

private:
        int real;
        int imag;       
};

int main()
{
        dio jojo(1,3);
        cout<<jojo;
        return 0;
}

2 在C++ 中 & 符号,不是取地址符, 而是叫做引用,可以理解为一个别名,
所以他这个函数返回一个ostream的引用就可以连续的使用 << 这个符号作为输出了,
反之不返回引用,就不能在一个cout里重复使用<<。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-3 15:43:30 | 显示全部楼层
本帖最后由 Krant5 于 2019-7-3 15:55 编辑

第二问: 那种情况下,叫做对象引用,而不是什么取地址, 主要是为了方便链式编程           比如cout <<1 <<2<<3
第一问的话太久没用C++了,记不清了,建议查查语法

另外,我用你的代码访问没有任何问题没报错误

aaa.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 13:07:07 | 显示全部楼层
newu 发表于 2019-7-3 15:41
1 我也是在VC6.0测试的,估计与编译器有关,新版编译器可能不会出现这种问题(试验后反馈下哈)。
第一个 ...

恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载<<时,如果用 using namespace std ;的话,会报错这是VC6.0的bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-7-6 13:07:38 | 显示全部楼层
Krant5 发表于 2019-7-3 15:43
第二问: 那种情况下,叫做对象引用,而不是什么取地址, 主要是为了方便链式编程           比如cout

恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载<<时,如果用 using namespace std ;的话,会报错这是VC6.0的bug
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-8 22:57:45 | 显示全部楼层
有风轻语 发表于 2019-7-6 13:07
恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载

好的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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