注册 登录
编程论坛 C++教室

[求助]给类加个友元输出操作符,怎么编译说不能访问私有成员?

华龙 发布于 2007-05-04 12:53, 1233 次点击
#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;
}
11 回复
#2
aipb20072007-05-04 13:24
vc++6.0 bug!
#3
华龙2007-05-04 14:08
那怎么办?
换IDE?
#4
aipb20072007-05-04 15:01
#5
华龙2007-05-04 16:27
谢谢楼各位了啊!
#6
华龙2007-05-04 16:38
以下是引用aipb2007在2007-5-4 15:01:10的发言:
https://bbs.bc-cn.net/viewthread.php?tid=133743&extra=&page=10#112525


看看这帖子

怎么我该掉了还是不行?

#7
aipb20072007-05-04 17:06
开始么看你代码,错误还真多!

[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]
#8
华龙2007-05-04 19:37
以下是引用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风格的?

#9
aipb20072007-05-04 20:08

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

两者可以混用!

#10
华龙2007-05-04 20:26
以下是引用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)

#11
aipb20072007-05-05 00:28

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

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

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

呵呵!

#12
华龙2007-05-05 10:19
以下是引用aipb2007在2007-5-5 0:28:02的发言:

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

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

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

呵呵!

谢谢啦哈!

1