| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 239 人关注过本帖
标题:friend类型的使用问题
收藏  订阅  推荐  打印 
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:1218
积分:13543
注册:2005-7-15
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-9-19 23:01
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:1218
积分:13543
注册:2005-7-15
刚找到答案

对于内嵌类,按C++标准,无需进行friend声明就可以访问外围类的私有成员了,因为它位于外围类的作用域范围内。  
  有些非标编译器必须进行friend声明,那么就必须先定义内嵌类再进行friend声明。否则,按C++标准的规定,就将是声明了另外一个同名的外部类为有元。
这样看来是 VC6 没有按照标准来!
但是我由疑问,按照上面的解释:红色部分的代码并不是声明class   A 内部的class  B,而是声明class   A 外部的class  B,可class   A 外部却并没有定义class  B类型,这怎么解释??
2008-9-19 23:08
沼泽
Rank: 12Rank: 12Rank: 12
等级:版主
威望:4
帖子:182
积分:2096
注册:2008-9-15

我说说我的看法,正如你说的那样有些非标编译器必须进行friend声明,那么就必须先定义内嵌类再进行friend声明。
   所以绿色的部分是对内嵌类的friend声明,如果只是红色的部分的声明的话,编译器会认为是对外部友元类的声明,由于你对内嵌类没有再进行friend声明,所以它不被编译器认可,所以不能访问A的私有变量。当然了在这里如果只对外部类进行声明而不定义,编译器不会报错。
   如果你同时去掉红色和绿色的注释,也不会出现错误了,为什么呢??我想你也应该清楚了,因为此时编译器会认为A有两个友元类,一个是外部类B,没有被定义,另一个是内嵌类,名字也是B,所以此时B能访问A的私有变量。
   不知道我这样的说法有没有问题?
2008-9-20 10:06
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:1218
积分:13543
注册:2005-7-15
回复 3# 沼泽 的帖子

没有定义的外部类声明后,在链接的时候找不到定义 应该报错吧?可为什么不呢
2008-9-20 13:40
chenlou
Rank: 1
来自:湖北黄冈武穴
等级:新手上路
威望:1
帖子:28
积分:440
注册:2008-9-21
回复 1# vfdff 的帖子

3楼的兄弟说的蛮有道理的。另外,没有定义的外部类声明后,在链接的时候找不到定义是不会报到错误的。就像你定义了一个变量或者声明了一个函数后面根本没有使用或定义,也不会报错的。因为在编译的时候进行的是语法检查和语义检查,而链接的时候进行的是链接器将目标文件和你所用到的c++类库文件一起链接生成exe文件,根本不会去检查函数或变量或类定义什么的。
2008-9-23 18:54
vfdff
Rank: 6Rank: 6
等级:金牌会员
威望:5
帖子:1218
积分:13543
注册:2005-7-15

那就是我如果使用了,它才会报错?
2008-9-24 17:33
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.076713 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved