为什么友元函数不能访问类的私有成员?

hxyzlhx1993 2008-04-11 02:28:25
友元函数不能访问类的私有成员?
以下代码在编译时通不过,显示很多错误,我将错误信息放在代码的注示中了,请各位高手给珍断珍断,谢谢!
#include <iostream>
#include <string>
using namespace std;

class String
{public:
String(){p=NULL;}
String(char *str);
friend bool operator>(String &st1,String &st2);
void display();
private: char *p;//错误2:see declaration of 'p'
};

String::String(char *str)
{p=str;}

void String::display()
{cout<<p;}

bool operator>(String &st1,String &st2)
{if(strcmp(st1.p,st2.p)>0) //错误1:error C2248: 'p' : cannot access private
// member declared in class 'String'
return true;
else return false;
}

int main()
{String st1("Hello"),st2("Book")
cout<<(st1>st2)<<endl;
return 0;
}
...全文
463 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
帅得不敢出门 2008-04-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 fuyunzhuri 的回复:]
我也碰到和楼主一样的问题,
关于这个问题,网上很多人说要去打什么sp4,sp5补丁,纯粹胡扯!!~
我的vc6.0本来就是sp6了 ~~~
我的解决方法如下:
删除 "using namespace std;"语句,第一句修改为"#include <iostream.h>",另外楼主的程序main()函数里也少了个分号, String st1("Hello"),st2("Book");加上分号~
修改后编译成功,输出结果为1...
我觉得C++有时候很让人崩溃,有的程序必须用到标准名称空间,有的地方就不能用~~~…
[/Quote]
支持
fuyunzhuri 2008-04-19
  • 打赏
  • 举报
回复
我也碰到和楼主一样的问题,
关于这个问题,网上很多人说要去打什么sp4,sp5补丁,纯粹胡扯!!~
我的vc6.0本来就是sp6了 ~~~
我的解决方法如下:
删除 "using namespace std;"语句,第一句修改为"#include<iostream.h>",另外楼主的程序main()函数里也少了个分号, String st1("Hello"),st2("Book");加上分号~
修改后编译成功,输出结果为1...
我觉得C++有时候很让人崩溃,有的程序必须用到标准名称空间,有的地方就不能用~~~
像这个问题就是不能使用标准名称空间的~~
估计是 "<<" 操作符重载时和标准空间里的 "<<" 出现问题吧~~
arong1234 2008-04-19
  • 打赏
  • 举报
回复
最可怜的是有人还用TC
arong1234 2008-04-19
  • 打赏
  • 举报
回复
VC6再微软早就不支持了,都已经进化出3各版本出来了,谁让你们还用那么老的编译器那:)
rularys 2008-04-19
  • 打赏
  • 举报
回复
看看这里
http://topic.csdn.net/u/20080106/17/48fb7474-4f99-415b-bf58-b59f255b3f66.html
OenAuth.Core 2008-04-11
  • 打赏
  • 举报
回复
int main()
{String st1("Hello"),st2("Book");加上分号
cout < <(st1>st2) < <endl;
return 0;
}

如上,添加上分号后,在VC6上编译运行通过,不过我的VC打的是SP6的补丁。呵呵。输出结果为1
而且程序本身也没什么问题
hui12345685 2008-04-11
  • 打赏
  • 举报
回复
这是vs2003下调试的可以通过

#include <iostream>
#include <string>
using namespace std;

class String
{
public:
String(){p=NULL;}
String(char *str);
friend bool operator>(String &st1,String &st2);
void display();
private:
char *p;
};

String::String(char *str)
{
p=str;
}

void String::display()
{
cout <<p;
}

bool operator>(String &st1,String &st2)
{
if(strcmp(st1.p,st2.p)>0)
return true;
else return false;
}

int main()
{
String st1("Hello"),st2("Book");
cout <<(st1>st2) <<endl;
return 0;
}
输出结果为1
jieao111 2008-04-11
  • 打赏
  • 举报
回复
我的编译运行都没问题,,还有你这样估计就行了
class String 
{public:
String(){p=NULL;}
String(char *str);
friend bool operator>(String &st1,String &st2)
{if(strcmp(st1.p,st2.p)>0) //错误1:error C2248: 'p' : cannot access private
// member declared in class 'String'
return true;
else return false;
}
void display();
private: char *p;//错误2:see declaration of 'p'
};
jieao111 2008-04-11
  • 打赏
  • 举报
回复
是你的编译器问题,v6对友元支持不好

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧