友元的问题!!!!

shuirh 2009-02-23 06:18:25
/*5-13 定义类X、Y、Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,
实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5,函数h(X*)是X的友元函数,
实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。*/

#include <iostream.h>

class X;
int H(X *px);

class Z
{
public:
int F(X *px)
{
return (px->i + 5);
}
};

class Y
{
public:
int G(X *px)
{
return (px->i + 1);
}
};

class X
{
int i;
public:
X(int num = 0)
{
i = num;
}
int Geti()
{
return i;
}
friend int Y :: G(X *px);
friend class Z;
friend int H(X *px);
};

int H(X *px)
{
return (px->i + 10);
}

main()
{
X xx;
X *px = &xx;
Y yy;
Z zz;
cout << "经过X,i=" << px->Geti();
cout << "经过Y,i=" << yy.G(px);
cout << "经过Z,i=" << zz.F(px);
cout << "经过函数H,i=" << H(px);
}

感觉友元太难了,郁闷,请大家帮我一下,谢谢了.
...全文
193 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairchild811 2009-02-23
  • 打赏
  • 举报
回复
friend可以访问private
shuirh 2009-02-23
  • 打赏
  • 举报
回复
//结论,友元函数的定义一定要放在类外.

//错误的程序1
/*#include <iostream.h>

class B;

class A
{
public:
int SetValue(B &b)
{
int val;

cout << "please input a value:";
cin >> val;
b.n = val;

return b.n;
}
};

class B
{
private:
int n;
friend int A :: SetValue(B &b);
};

main()
{
B b;
A a;

cout << a.SetValue(b) << endl;
}*/

//错误的程序2
#include <iostream.h>

class A;

class B
{
private:
int n;
friend int A :: SetValue(B &b);
};

class A
{
public:
int SetValue(B &b)
{
int val;

cout << "please input a value:";
cin >> val;
b.n = val;

return b.n;
}
};

main()
{
B b;
A a;

cout << a.SetValue(b) << endl;
}

//正确的程序
/*#include <iostream.h>

class B;

class A
{
public:
int SetValue(B &b);
};

class B
{
private:
int n;
friend int A :: SetValue(B &b);
};

int A :: SetValue(B &b)
{
int val;

cout << "please input a value:";
cin >> val;
b.n = val;

return b.n;
}

main()
{
B b;
A a;

cout << a.SetValue(b) << endl;
}*/

终于搞清楚了!!!!
ts118 2009-02-23
  • 打赏
  • 举报
回复
把friend int Y::G(X* px)改成 friend class Y 就没问题。

等高手讲解!
shuirh 2009-02-23
  • 打赏
  • 举报
回复
我在class Z之前声明了的啦,为什么还报错呢????
shuirh 2009-02-23
  • 打赏
  • 举报
回复
程序有2个错误,都是报上面的错误,大家帮我改正一下,费心了,谢谢.
zqz981 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shuirh 的回复:]
class Z
{
public:
int F(X *px)    //老是报这里的X是一个没有定义的类,我真是纳闷了,我在前面不是声明了class X的吗?
{
return (px->i + 5);
}
};

我的程序如何改才正确啊?
[/Quote]
在class Z 之前 声明一下 class X
zqz981 2009-02-23
  • 打赏
  • 举报
回复
mark
shuirh 2009-02-23
  • 打赏
  • 举报
回复
class Z
{
public:
int F(X *px) //老是报这里的X是一个没有定义的类,我真是纳闷了,我在前面不是声明了class X的吗?
{
return (px->i + 5);
}
};

我的程序如何改才正确啊?
sxbwelcome 2009-02-23
  • 打赏
  • 举报
回复
我来回答你这个问题,保证你不会再觉得友元难以理解了
类实现了封装,保证了数据的安全性,但是也限制了访问数据成员的自由【类中的私有成员只有被类的成员函数所访问】
为了平衡,c++提出了友元机制,允许类外的函数访问类的私有成员,只要你授权给它
就好比你为了保证安全,把家里的门窗全都堵死了,但是也限制了你的亲友【当然自己进出是没问题的】,折中的办法就是开一个小窗户,只有经过授权的人才能通过【也就是声明他为朋友】
友元有三种形式:
声明一个普通函数为类的友元:该类的所有成员对此函数开放
声明a类的成员函数fun为b类的友元:a类的成员函数fun可以自由访问b类的成员
声明a类为b类的友元:a类的所有成员函数可以自由访问b类的成员
insulted 2009-02-23
  • 打赏
  • 举报
回复
通过把函数或操作符声明为友元,一个类可以授予这个函数或操作符访问其非公有成员的权力。

友元声明以关键字friend开始,它只能出现在类定义中。因为友元不是授权类的成员,所以它不受其所在类的声明区域(public,private和protect)的影响。

友元声明的最常见用法是:允许非成员的重载操作符访问一个“视其为朋友”的类的私有成员。原因是,除了提供左和右操作数的对称性外,非成员的重载操作符就像成员函数一样,能够完全访问一个类的私有成员。

如果一个函数操纵两个不同类类型的对象,而且该函数需要访问这两个类的非公有成员,则这个函数可以被声明为这两个类的友元,或者作为一个类的成员函数,并声明为另一个类的友元。
waizqfor 2009-02-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 shuirh 的帖子:]
/*5-13 定义类X、Y、Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,
实现对X的成员i加1,类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5,函数h(X*)是X的友元函数,
实现对X的成员i加10。在一个文件中定义和实现类,在另一个文件中实现main()函数。*/

#include <iostream.h>

class X;
int H(X *px);

class Z
{
public:
int F(X *px)
{
return (px->i + 5);
}
};

[/Quote]
LZ错误都是 提前引用的问题 你在程序的开始做一下声明 就没事了
太乙 2009-02-23
  • 打赏
  • 举报
回复
哪儿有问题?

65,211

社区成员

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

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