📄 subject_53748.htm
字号:
<p>
序号:53748 发表者:miuqoms 发表日期:2003-09-22 20:16:30
<br>主题:请问一个类的友元函数能访问该类的私有数据成员吗???谢谢!!!
<br>内容:我试过,但不能。那声明友元又有什么用呢???<BR>实在不明白,请哪位能够指点一下。<BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:a dog 回复日期:2003-09-22 20:34:47
<br>内容:你是如何访问的,我记得是可以的呀。要用<BR><BR>类名::成员变量名<BR><BR>的格式。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:a dog 回复日期:2003-09-22 20:39:37
<br>内容:还有一种访问方式:<BR>对象名。私有成员名
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-22 20:44:29
<br>内容:哦,对对对。友元函数可以访问<BR>但友元类好像不行。<BR>简单的举个例子,你看看:<BR><BR>#include <iostream.h><BR>class A<BR>{friend class B;<BR> int i;<BR>};<BR><BR>class B<BR>{<BR> public :<BR> show() {cout<<i;}<BR>};<BR><BR>编译不能通过,说i未定义。不是可以直接用A中的i吗???
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:a dog 回复日期:2003-09-22 20:52:20
<br>内容:static私有成员才可以啊。<BR>否则就只能用这种格式了:<BR>对象名.私有成员名<BR><BR>因为没有对象,怎么有i呢?<BR>正所谓:<BR>皮之不存,毛将。。。。。。<BR>忘了。。。。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-22 21:01:16
<br>内容:皮之不存,毛之焉附 :)<BR><BR>你是说改成在A中改成 static int i; 吗??<BR>还是不行啊: undeclared identifier 。<BR>定义了对象也不行啊,您瞧瞧(写的很糟糕):<BR><BR>#include <iostream.h><BR>class A<BR>{friend class B;<BR>static int i;<BR>};<BR><BR>class B<BR>{<BR>public :<BR> show() {cout<<i;}<BR>};<BR><BR>main()<BR>{<BR> B b;<BR> b.show(); <BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-22 21:20:14
<br>内容:狂晕<BR>看看下面<BR><BR>#include <iostream><BR>using namespace std;<BR><BR>class X {<BR> friend class Y;<BR>private:<BR> int i;<BR>};<BR><BR>class Y {<BR> X x;<BR>public:<BR> void SetXi(int i) { x.i = i; }<BR> int GetXi() { return x.i; }<BR>};<BR><BR>int main()<BR>{<BR> Y y;<BR> y.SetXi(3);<BR> cout << y.GetXi() << endl;<BR> return 0;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:a dog 回复日期:2003-09-22 21:24:06
<br>内容:静态成员要初始化呀!<BR>class A<BR>{<BR>static int i;<BR>friend class B;<BR>};<BR>class B<BR>{<BR>public :<BR> void show() {cout<<A::i;}<BR>};<BR><BR>int A::i=100;<BR>main()<BR>{<BR>B b;<BR>b.show(); <BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-22 21:25:21
<br>内容:呵呵,7楼写出那样干什么。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:a dog 回复日期:2003-09-22 21:33:06
<br>内容:呵呵,好玩!<BR>不知水兄的工作怎么样了?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-22 21:34:34
<br>内容:失业中,学习中的游民
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-23 10:26:01
<br>内容:不好意思,昨天晚上机器出毛病了,重装了一下,所以没来得及及时看<BR><BR>请问水番先生:这样的写法有什么好处吗?可以在X中直接写Set和Get函数啊。<BR>我想要的是在一个类中*直接*存取(就是直接用到,而不是用存取函数)另一个类的私有数据成员,能做到吗?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-23 10:41:58
<br>内容:我只是举个例子<BR>直接也可以做到,但是意义有多大,那就要视情况而论<BR>class D;<BR>class B<BR>{<BR> friend class D;<BR>private:<BR> int i;<BR>};<BR><BR>class D : public B<BR>{<BR>public:<BR> int Get() const { return i; }<BR>};<BR><BR>int main()<BR>{<BR> return 0;<BR>}
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-23 10:59:23
<br>内容:哈哈,原来水番先生在啊,明白了,谢谢。<BR>再看看这个吧,有元函数的存取,书上的例题好像能的,但我的怎么不行呢?<BR>#include <iostream><BR>#include <string><BR>using namespace std;<BR>class Student<BR>{<BR> public:<BR> //……<BR> private:<BR> int i;<BR> friend istream & operator >>(istream &,Student &);<BR> friend ostream & operator <<(ostream &,Student &);<BR>};<BR><BR>ostream & operator <<(ostream &os,Student &S)<BR>{<BR> os<<S.i<<endl;<BR> return os;<BR>}<BR><BR>输出重载中能用到S.i这样的写法吗?有个例题是这样的。但这个通不过。<BR>还有:S不是Student的一个对象吗?怎么就能直接用S.i呢,不是要通过公用的存取函数吗?<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-23 11:06:50
<br>内容:把错误提示贴上来<BR>还有,在Student& S前加上const
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-23 11:11:12
<br>内容: error C2248: 'i' : cannot access private member declared in class 'Student'<BR> : see declaration of 'i'<BR> Stu.obj - 1 error(s), 0 warning(s)<BR><BR>加了const也一样啊!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-23 11:14:24
<br>内容:能不能把完整的源代码贴上来,
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-23 11:19:43
<br>内容:其实是一个学生类,我想把输出弄简单点,所以就重载<<<BR>但问题就出在这里,不能直接存取类的私有成员,如果在这个重载中再用Get,Set之类的那就太麻烦了,而且不划算。<BR>其他的都已经注释掉了,就剩下上面的这么一点东西。我就是想看看怎么存取。结果出错了,我也弄不清是怎么回事。 :((
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:水番 回复日期:2003-09-23 11:25:54
<br>内容:#include <iostream><BR>#include <string><BR>using namespace std;<BR>class Student;<BR>ostream & operator <<(ostream &,const Student &);<BR>class Student<BR>{<BR>public:<BR> //……<BR>private:<BR> int i;<BR> friend ostream & operator <<(ostream &,const Student &);<BR>};<BR><BR>ostream & operator <<(ostream &os,const Student &S)<BR>{<BR> os<<S.i<<endl;<BR> return os;<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-23 11:30:37
<br>内容:嘿嘿<BR>行了,谢谢!!!!<BR>但为什么是这样呢?<BR>请先生点解一下。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-23 11:35:21
<br>内容:我也有点奇怪!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-23 11:43:23
<br>内容:那你是怎么想到的?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:水番 回复日期:2003-09-23 12:22:23
<br>内容:因为正常的话应该没有问题,现在出现问题,所以我怀疑程序不知道friend ostream & operator <<(ostream &,const Student &);是<BR>ostream & operator <<(ostream &os,const Student &S)<BR>{}<BR>所以在上面加上声明试试。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:miuqoms 回复日期:2003-09-24 19:14:56
<br>内容:你真细心啊<BR>还有,就是输入重载时不能加那个const是吧,今天在这个地方又犯了错了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:由零开始 回复日期:2003-12-10 13:58:30
<br>内容:要是友元函数在类里面直接定义就可以,要是在外面定义就需要在类的定义之前加上类的声明和友元的声明,即使我在类的定义之后再次声明友元函数也不行。不知道是不是就是这样的规定,够绕弯儿的:)
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -