| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1230 人关注过本帖
标题:[求助]给类加个友元输出操作符,怎么编译说不能访问私有成员?
取消只看楼主 加入收藏
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
 问题点数:0 回复次数:6 
[求助]给类加个友元输出操作符,怎么编译说不能访问私有成员?
#include <iostream>
class student
{
public:
student(){}
student(const std::string &name,char &c,unsigned &age):stdname(name),sex(c),stdage(age){}
friend std::ostream &operator<<(std::ostream &,const student &);
~student(){}
private:
std::string stdname;
char sex;
unsigned stdage;
};
std::ostream &operator>>(std::istream &os,const student &std)
{
os<<std.stdname<<' '<<std.sex<<' '<<std.stdage;
return os;
}
int main()
{
student st("zhangjiao",'m',21);
std::cout<<st<<std::endl;
return 0;
}
搜索更多相关主题的帖子: std 操作符 student 成员 
2007-05-04 12:53
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
得分:0 
那怎么办?
换IDE?
2007-05-04 14:08
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
得分:0 
谢谢楼各位了啊!
2007-05-04 16:27
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
得分:0 
以下是引用aipb2007在2007-5-4 15:01:10的发言:
http://bbs.bc-cn.net/viewthread.php?tid=133743&extra=&page=10#112525


看看这帖子

怎么我该掉了还是不行?

2007-05-04 16:38
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
得分:0 
以下是引用aipb2007在2007-5-4 17:06:55的发言:
开始么看你代码,错误还真多!

[CODE]#include <iostream>
#include <string> //你用了string
class student
{
public:
student(){}
student(const std::string &name,char c,unsigned int age):stdname(name),sex(c),stdage(age){}//内置类型最
//好不用引用,年龄该unsigned int吧

friend std::ostream &operator<<(std::ostream &,const student &);
~student(){}
private:
std::string stdname;
char sex;
unsigned int stdage;//还有这里
};
std::ostream &operator<<(std::ostream &os,const student &std)//最严重,你重载的是<<怎么变成>>,是ostream
//不是istream

{
os<<std.stdname<<' '<<std.sex<<' '<<std.stdage;
return os;
}
int main()
{
student st("zhangjiao",'m',21);
std::cout<<st<<std::endl;
return 0;
}[/CODE]

真是太感谢你啦!
那这种方式里面要用字符串岂不是非要要C风格的?

2007-05-04 19:37
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
得分:0 
以下是引用aipb2007在2007-5-4 20:08:35的发言:

在c++里,字符串用的string类类型。
但是也兼容c风格字符串,是char[]类型,c风格字符串在末尾追加空字符'\0'。

两者可以混用!

用iostream不能用friend访问private成员,要访问就要iostream.h;用string,加上std::,又说不能访问私有的,如下:
#include <iostream.h>
#include <string>
class student
{
public:
student(){}
student(const std::string &name,char c,unsigned int age):stdname(name),sex(c),stdage(age) {}
friend ostream &operator<<(ostream &,const student &);
~student(){}
private:
std::string stdname;
char sex;
unsigned int stdage;//还有这里
};
ostream &operator<<(ostream &os,const student &std)//最严重,你重载的是<<怎么变成>>,是ostream
//不是istream
{
os<<std.stdname<<' '<<std.sex<<' '<<std.stdage;
return os;
}
int main()
{
student st("zhangjiao",'m',21);
cout<<st<<endl;
return 0;
}
compiling...
4.cpp
D:\VC\MSDev98\MyProjects\4\4.cpp(19) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'const class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is no acceptable
conversion)
Error executing cl.exe.

4.obj - 1 error(s), 0 warning(s)

2007-05-04 20:26
华龙
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2007-4-3
收藏
得分:0 
以下是引用aipb2007在2007-5-5 0:28:02的发言:

代码是没有问题的,编译器的问题。

我觉得改了头文件让他通过编译是个非正式行为,没必要非这样做。
你可以不用管,你换个编译器就好了。非要在vc6下运行这个,你可以不用友员重载,直接在类定义外重载,增加个私有成员的访问接口或者直接把私有改公有。

还有个办法就是把类声明和定义分开在两个文件中,这样也行吧,不过没试过。

呵呵!

谢谢啦哈!

2007-05-05 10:19
快速回复:[求助]给类加个友元输出操作符,怎么编译说不能访问私有成员?
数据加载中...
 
   



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

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