注册 登录
编程论坛 C++教室

友元函数却不能访问私有成员,是怎么回事?

zzt_428 发布于 2008-12-10 09:52, 1805 次点击
#ifndef VECTOR_H_
#define VECTOR_H_
#include <iostream>
using namespace std;

class Vector
{
private:
    double x;
    double y;
    double mag;
    double ang;
    char mode;
    //private methods
    void set_mag();
    void set_ang();
    void set_x();
    void set_y();

public:
    Vector();
    Vector(double n1, double n2, char form='r');
    void set(double n1, double n2, char form='r');
    ~Vector();
    double xval() const { return x; }
    double yval() const { return y; }
    double magval() const { return mag; }
    double angval() const { return ang; }
    void polar_mode();
    void rect_mode();
    //operator overloading
    Vector operator+(const Vector &v) const;
    Vector operator-(const Vector &v) const;
    Vector operator-() const;
    Vector operator*(double n) const;
    //friends
    friend Vector operator*(double n, const Vector &v);
    friend ostream & operator<<(ostream &os, const Vector &v);
};//end class Vector
#endif

//部分函数定义省略
//.........
ostream & operator<<(ostream &os, const Vector &v)
{
    if(v.mode == 'r')
        os << "(x,y)=(" << v.x << "," << v.y << ")";
    else if(v.mode == 'p')
        os << "(m,a)=(" << v.mag << "," << v.ang*Rad_to_deg << ")";
    else
        os << "Vector object mode is invalid.";

    return os;
}

这里编译器报错,说不能访问私有成员是怎么回事?明明定义为友元的...
7 回复
#2
newyj2008-12-10 10:55
去掉 const 试试
#3
maoguoqing2008-12-10 15:35
如果是VC,它对友元的支持不太好
#include <iostream.h>试试
#4
zzt_4282008-12-10 19:44
谢谢楼上两位,我用VC6.0,不是标准的C++
#5
hitcolder2008-12-10 22:30
回复 楼主 zzt_428 的帖子
没见过设置输出流为友元的情况啊,谁会给解释下啊
#6
zzt_4282008-12-11 11:25
回楼上的,那不是将输出流作为友元,而是将操作符号<<重载了
#7
zzt_4282008-12-11 11:26
返回一个Ostream 类型的对象的引用
#8
无水之冰2008-12-11 19:05
friend Vector operator*(double n, const Vector &v);
把这句注释起来看看。
我也遇到过类似的,把友元并且重载操作符的函数注释起来就可以了
是不是友元函数就不能再重载操作符?如果不能的话就不会说了,但好像又可以,别人在BCB编译器下就通过,我用的VC++ 6.0,报错。
或许是编译器的问题
1