标题:为什么声明了friend却不能访问private member?
只看楼主
tao4359
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-6-5
 问题点数:0 回复次数:10 
为什么声明了friend却不能访问private member?

我写了一个String类,定义如下:
class String
{
friend bool operator==(const String&,const String&);
friend bool operator==(const String&,const char*);
........
..........
private:
char* _char;
int _size;
..........
public:
.........
.........
};

operator== 定义如下:

bool operator==(const String &str,const String &str1)
{
if(str._size!=str1._size)
return false;
else
{
return strcmp(str._char,str1._char)? false:true;
}
}

但编译器却报错:
error C2248: '_size' : cannot access private member declared in class 'String'

请问各位是为什么啊?谢谢先

搜索更多相关主题的帖子: friend String member private operator 
2006-06-05 23:20
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 

你好,能告诉我把友员函数声明为私有和公友,有什么区别吗?


2006-06-05 23:56
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

友元不存在于私有还是共友,随便放哪都一样


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-06 00:26
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 

lz:
光看你写的代码,应该不会出现这个问题啊~!


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-06 00:30
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 

在类前加上以下语句:
class String;
bool operator==(const String&,const String&);


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-06 09:17
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
得分:0 
以下是引用wfpb在2006-6-6 0:26:00的发言:

友元不存在于私有还是共友,随便放哪都一样

哦,知道了


2006-06-06 11:49
tao4359
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-6-5
得分:0 
解决了
谢谢版主!!
2006-06-06 12:04
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
以下是引用aogun在2006-6-6 9:17:00的发言:

在类前加上以下语句:
class String;
bool operator==(const String&,const String&);

上次是那个<<运算符重载,这次有是为什么要加这两句啊?难道又有哪里产生歧义?
指教


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-06 12:43
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
以下是引用wfpb在2006-6-6 12:43:00的发言:

上次是那个<<运算符重载,这次有是为什么要加这两句啊?难道又有哪里产生歧义?
指教

呵呵,其实按照c++规定,这里不应该加的,但是由于VC6对于标准c++的支持并不是很好,所以在VC6中是要加的,lz的代码用gcc编译是不会有问题的
类似的还有stl的警告,for语言内的作用域等(如for(int i...)中的i的作用域)


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-06 15:25
lcytc2005
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2006-5-24
得分:0 
要前向引用声明
2006-06-06 16:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-70012-1-1.html




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

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