关于友元成员函数为什么不能相互为友元函数的问题?

azhou88 2013-11-26 04:03:18
#include <iostream>

using namespace std;
/*class fff;*/
class abc
{
public:
friend class fff;
/* friend void fff::fortuneffff();*/ //这句不可行
void fortune();
private:
int m;
};
class fff
{
public:
void fortuneffff();


private:
int x;

friend void abc::fortune();
};

void abc::fortune()
{
fff m1;
m1.x=888;
cout<<m1.x<<endl;

}
void fff::fortuneffff()
{
abc c;
c.m=1222;
cout<<c.m<<endl;

}
int main()

{
abc l;
l.fortune();
fff ll;
ll.fortuneffff();
return 0;
}

代码可能有点凌乱,我大致说一下,方便阅读。两个类,一个是abc,一个是fff. abc中的成员函数作为友元在fff中使用没有问题。

现在问题是,fff中的函数作为友元函数在abc使用出错,除非把友元函数修改成为友元类才ok.

friend void fff::fortuneffff(); 这句话可行吗?有什么解决的方法?
...全文
333 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-11-30
  • 打赏
  • 举报
回复
友元函数的参数,最好有一个是该类的指针或者引用类型的。 和该类无关的函数,最好不要定义成友元。
Adol1111 2013-11-28
  • 打赏
  • 举报
回复
引用 6 楼 unituniverse2 的回复:
类互相依赖的情况是有的。拿现实中的问题举例,就是所谓的共生关系。几个类对象需要相互依赖,但逻辑上却无法作为一个大类存在。多任务设计中很容易碰到这种问题(比如设计关键区,需要访问类和关键区对象类两个类型,几个访问类对象共同使用一个关键区对象)。以前的设计人员会强制的将这些封装到一个整体里面,但是结果往往是扩展的时候手续复杂甚至到荒谬的程度,或者干脆重新实现一个功能类似的拓扑结构。 我觉得像这样偏执的坚持按照一元oop设计不是一个好的解决方式。 操作符重载也需要友员。 但不要给自己滥用友员找借口。图一时快活结果维护的时候麻烦更大。毕竟一元oop造成发散的可能性小,设计成一元式更好理解(而不只是更容易写)的情况下就不要用分散式的
+1 按照OO的思想,可以少量的使用友元函数,但最好不要使用友元类。在使用友元时总要想一下是否有这个必要,有没有更好的代替方案。破坏封装绝不是一种良好的设计。
unituniverse2 2013-11-27
  • 打赏
  • 举报
回复
类互相依赖的情况是有的。拿现实中的问题举例,就是所谓的共生关系。几个类对象需要相互依赖,但逻辑上却无法作为一个大类存在。多任务设计中很容易碰到这种问题(比如设计关键区,需要访问类和关键区对象类两个类型,几个访问类对象共同使用一个关键区对象)。以前的设计人员会强制的将这些封装到一个整体里面,但是结果往往是扩展的时候手续复杂甚至到荒谬的程度,或者干脆重新实现一个功能类似的拓扑结构。 我觉得像这样偏执的坚持按照一元oop设计不是一个好的解决方式。 操作符重载也需要友员。 但不要给自己滥用友员找借口。图一时快活结果维护的时候麻烦更大。毕竟一元oop造成发散的可能性小,设计成一元式更好理解(而不只是更容易写)的情况下就不要用分散式的
unituniverse2 2013-11-27
  • 打赏
  • 举报
回复
引用 3 楼 combobox2013 的回复:
[quote=引用 1 楼 truelance 的回复:] 你这样设计不合理, 没有好的解决办法 class foo; //声明foo, 但没有foo内部的定义 class bar { public: friend class foo; //可以, foo已经声明 friend void foo::function1(); //不可以, foo:function1没有声明或定义 void function2(void); }; class foo { public: friend void bar::function2(); //可以, bar::function2已经声明过 void function1(void); };
请问友元是相互的吗? [/quote] 友员不相互、不继承、不传递
azhou88 2013-11-27
  • 打赏
  • 举报
回复
自己给自己定一下,希望有识之士继续回答
Adol1111 2013-11-27
  • 打赏
  • 举报
回复
良好的设计应该尽量避免友元类,极大程度的限制他的使用,更不要说互为友元了。
combobox2013 2013-11-27
  • 打赏
  • 举报
回复
引用 1 楼 truelance 的回复:
你这样设计不合理, 没有好的解决办法 class foo; //声明foo, 但没有foo内部的定义 class bar { public: friend class foo; //可以, foo已经声明 friend void foo::function1(); //不可以, foo:function1没有声明或定义 void function2(void); }; class foo { public: friend void bar::function2(); //可以, bar::function2已经声明过 void function1(void); };
请问友元是相互的吗?
熊熊大叔 2013-11-26
  • 打赏
  • 举报
回复
你这样设计不合理, 没有好的解决办法
class foo; //声明foo, 但没有foo内部的定义
class bar {
public:
friend class foo; //可以, foo已经声明
friend void foo::function1(); //不可以, foo:function1没有声明或定义
void function2(void);
};

class foo {
public:
friend void bar::function2(); //可以, bar::function2已经声明过
void function1(void);
};

64,692

社区成员

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

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