| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1793 人关注过本帖
标题:友元函数却不能访问私有成员,是怎么回事?
只看楼主 加入收藏
zzt_428
Rank: 2
来 自:南京师范大学
等 级:论坛游民
威 望:2
帖 子:243
专家分:22
注 册:2008-7-6
收藏
 问题点数:0 回复次数:7 
友元函数却不能访问私有成员,是怎么回事?
#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;
}

这里编译器报错,说不能访问私有成员是怎么回事?明明定义为友元的...
搜索更多相关主题的帖子: 函数 成员 访问 
2008-12-10 09:52
newyj
Rank: 2
等 级:新手上路
威 望:3
帖 子:542
专家分:0
注 册:2008-1-4
收藏
得分:0 
去掉 const 试试
2008-12-10 10:55
maoguoqing
Rank: 6Rank: 6
来 自:重庆
等 级:贵宾
威 望:28
帖 子:2980
专家分:19
注 册:2005-12-5
收藏
得分:0 
如果是VC,它对友元的支持不太好
#include <iostream.h>试试

天行健,君子以自强不息!!QQ:68660681
2008-12-10 15:35
zzt_428
Rank: 2
来 自:南京师范大学
等 级:论坛游民
威 望:2
帖 子:243
专家分:22
注 册:2008-7-6
收藏
得分:0 
谢谢楼上两位,我用VC6.0,不是标准的C++

学习切忌浮躁.
2008-12-10 19:44
hitcolder
Rank: 1
等 级:新手上路
威 望:1
帖 子:124
专家分:0
注 册:2008-10-28
收藏
得分:0 
回复 楼主 zzt_428 的帖子
没见过设置输出流为友元的情况啊,谁会给解释下啊

不要在你的智慧中夹杂傲慢,也不要使你们的谦卑缺乏智慧的成分。
2008-12-10 22:30
zzt_428
Rank: 2
来 自:南京师范大学
等 级:论坛游民
威 望:2
帖 子:243
专家分:22
注 册:2008-7-6
收藏
得分:0 
回楼上的,那不是将输出流作为友元,而是将操作符号<<重载了

学习切忌浮躁.
2008-12-11 11:25
zzt_428
Rank: 2
来 自:南京师范大学
等 级:论坛游民
威 望:2
帖 子:243
专家分:22
注 册:2008-7-6
收藏
得分:0 
返回一个Ostream 类型的对象的引用

学习切忌浮躁.
2008-12-11 11:26
无水之冰
Rank: 2
等 级:论坛游民
帖 子:54
专家分:41
注 册:2007-6-5
收藏
得分:0 
friend Vector operator*(double n, const Vector &v);
把这句注释起来看看。
我也遇到过类似的,把友元并且重载操作符的函数注释起来就可以了
是不是友元函数就不能再重载操作符?如果不能的话就不会说了,但好像又可以,别人在BCB编译器下就通过,我用的VC++ 6.0,报错。
或许是编译器的问题
2008-12-11 19:05
快速回复:友元函数却不能访问私有成员,是怎么回事?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011717 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved