有风轻语 发表于 2019-7-3 15:22:21

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

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

#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 时出错.

newu 发表于 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里重复使用<<。

Krant5 发表于 2019-7-3 15:43:30

本帖最后由 Krant5 于 2019-7-3 15:55 编辑

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

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

有风轻语 发表于 2019-7-6 13:07:07

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

恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载<<时,如果用 using namespace std ;的话,会报错这是VC6.0的bug

有风轻语 发表于 2019-7-6 13:07:38

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

恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载<<时,如果用 using namespace std ;的话,会报错这是VC6.0的bug

newu 发表于 2019-7-8 22:57:45

有风轻语 发表于 2019-7-6 13:07
恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载

好的
页: [1]
查看完整版本: c++重载<<操作符和友缘问题。