| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3099 人关注过本帖
标题:friend类型的使用问题
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:6 
friend类型的使用问题
class   A  
{  
private:      
    int   i;  
public:
    friend   class   B;
    class   B  
    {  
    public:  
        B(A &a)  
        {  
            a.i=0;//编译器编译到这里的时候,还没有看到后面的friend句  
        }  
    };  
    //friend   class   B;
};  

int   main()  
{  
    return   0;  
}
上述代码在 VS2005 下能通过编译,但是在VC6下不能通过,提示:
error C2248: 'i' : cannot access private member declared in class 'A'

但是换成红色的被注释,绿色的去掉注释之后,两个编译器下均能通过编译,这个为什么?
搜索更多相关主题的帖子: VS2005 版本 private friend 
2008-09-19 23:01
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
刚找到答案
对于内嵌类,按C++标准,无需进行friend声明就可以访问外围类的私有成员了,因为它位于外围类的作用域范围内。  
  有些非标编译器必须进行friend声明,那么就必须先定义内嵌类再进行friend声明。否则,按C++标准的规定,就将是声明了另外一个同名的外部类为有元。
这样看来是 VC6 没有按照标准来!
但是我由疑问,按照上面的解释:红色部分的代码并不是声明class   A 内部的class  B,而是声明class   A 外部的class  B,可class   A 外部却并没有定义class  B类型,这怎么解释??
2008-09-19 23:08
沼泽
Rank: 4
等 级:业余侠客
威 望:8
帖 子:291
专家分:228
注 册:2008-9-15
收藏
得分:0 
我说说我的看法,正如你说的那样有些非标编译器必须进行friend声明,那么就必须先定义内嵌类再进行friend声明。
   所以绿色的部分是对内嵌类的friend声明,如果只是红色的部分的声明的话,编译器会认为是对外部友元类的声明,由于你对内嵌类没有再进行friend声明,所以它不被编译器认可,所以不能访问A的私有变量。当然了在这里如果只对外部类进行声明而不定义,编译器不会报错。
   如果你同时去掉红色和绿色的注释,也不会出现错误了,为什么呢??我想你也应该清楚了,因为此时编译器会认为A有两个友元类,一个是外部类B,没有被定义,另一个是内嵌类,名字也是B,所以此时B能访问A的私有变量。
   不知道我这样的说法有没有问题?
2008-09-20 10:06
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 3# 沼泽 的帖子
没有定义的外部类声明后,在链接的时候找不到定义 应该报错吧?可为什么不呢
2008-09-20 13:40
chenlou
Rank: 1
来 自:湖北黄冈武穴
等 级:新手上路
威 望:2
帖 子:49
专家分:0
注 册:2008-9-21
收藏
得分:0 
回复 1# vfdff 的帖子
3楼的兄弟说的蛮有道理的。另外,没有定义的外部类声明后,在链接的时候找不到定义是不会报到错误的。就像你定义了一个变量或者声明了一个函数后面根本没有使用或定义,也不会报错的。因为在编译的时候进行的是语法检查和语义检查,而链接的时候进行的是链接器将目标文件和你所用到的c++类库文件一起链接生成exe文件,根本不会去检查函数或变量或类定义什么的。
2008-09-23 18:54
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
那就是我如果使用了,它才会报错?
2008-09-24 17:33
快速回复:friend类型的使用问题
数据加载中...
 
   



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

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