请大家说一说友元吧。我感觉大家讨论的比较少
友元类该如何使用?
比如我现在有两个类,一个是记录数据的类,一个是对话框类。现在对话框类显示的数据都是这个数据类里面的。这两个类关系非常密切,但因为数据类还有其它用途,不能合并成一个类,那么是否可以定义成友元类呢?
可以说没有用过友元类,希望大家讨论一下。
假设A类和B类都定义了实例,m_A和m_B,并且相互定义成友元类。那么我在m_A中如何才能操作m_B的数据呢?
问题点数:30、回复次数:12Top
1 楼xuzheng318(忧郁王子)回复于 2004-12-01 11:49:15 得分 0
哇· 1楼 沙发
Top
2 楼xuzheng318(忧郁王子)回复于 2004-12-01 11:52:13 得分 10
friend
申明一个函数(或类)为友元,这个函数(或类)就可以访问类中的私有成员
ex:
class C
{
int a;
public:
friend void f();
} cc;
friend void f()
{
cc.a = 1; //correct
}
void nf()
{
cc.a = 1; //incorrect
}
f()就是class C的对象cc的友元函数.
同理申明友元类Top
3 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-12-01 12:53:30 得分 0
哇,抢三楼!!Top
4 楼happyparrot(快乐鹦鹉)回复于 2004-12-01 12:55:26 得分 0
那么,如果我定义class c的若干个实例c1,c2,c3时,
friend void f()
{
cc.a = 1; //correct
}
这个函数里面调用哪个?Top
5 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-12-01 12:56:16 得分 5
class A
{
friend class B;
friend Return_Type function(xxx,xxx,xxx);
};
B 和 Return_Type function(xxx,xxx,xxx); 可以访问A的private memberTop
6 楼qnjian(南一郎 )回复于 2004-12-01 13:52:39 得分 5
其实不难的,如果已声明B类为A类的友元类,如:
calss A
{
public:
A()...
friend B;
private:
int a;
....
};
那么经B类可以像在类A内部一样直接访问A类的成员,包括私有成员。
如:
class B
{
public:
B()...
void setValue(int n)
{
A.a=n;
}
Private:
......
};
友元函数也一样,如果你是我的朋友,我家里的东西都可以与你分享,你就可以直接到我家里来,要拿什么你有自由。
注意:1、友元关系不能传递。你是我的友元,小明是你的友元,但没有经我同意的话,小明就不是我的友元。
2、友元不能继承。你是我的友元。我同意你分享我的秘密,但我儿子可不一定同意。
3、友元不是双向的。我同意你分享我的秘密,你却不一定同意我分享你的秘密。必须都得到声明才行。Top
7 楼qnjian(南一郎 )回复于 2004-12-01 13:55:38 得分 0
补充一点:友元不是类的一部分,它可以放在类声明中的任意地方,不管是公有部分还是私有部分,作用是一样的。Top
8 楼qnjian(南一郎 )回复于 2004-12-01 14:01:55 得分 0
不好意思,后一个例子错了,改为(B类有了一个A类的内部成员):
class B
{
public:
B()...
void setValue(int n)
{
cA.a=n;
}
Private:
A cA;
......
};
Top
9 楼BluntBlade(信仰迷离·重构之道,在于Redo/Undo之间)回复于 2004-12-01 16:35:24 得分 0
唉……鸟人……Top
10 楼wwxsoft(婉儿)回复于 2004-12-01 16:46:08 得分 0
haha ,分数多的没法处理了,就来散分呀!!!!!Top
11 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-12-01 18:10:47 得分 0
UPUP:)Top
12 楼fjpqzm(梦花园)回复于 2004-12-01 18:30:31 得分 10
声明某个函数或类为其他函数或类的有元时,在编译时为什么
要在其前面在声明一下。如:
[code]
class A;
ostream& operator<<(ostream &out,const Cmystring &rhs);
class Cmystring
{
public:
A(***,***);
friend ostream& operator<<(ostream &out,const Cmystring &rhs);
}
[\code]Top
相关问题
- [讨论]关于SQL注入安全问题。(看到很多网站被破解,感觉有必要讨论)
- 真的感觉SPRING不是特别的好,欢迎大家来讨论
- [请问] 有多少朋友认为爱情是感觉的,为什么?
- 大家讨论讨论,结个婚到底要花多少钱??
- 你觉得什么时候最幸福?什么样的感觉叫幸福?欢迎讨论!
- 讨论:vc++的出路? ---随着vs.net的正式发行,感觉到vc++的鸡肋作用,弃之可惜~~
- 讨论,这个网站是如何实现的...(看过之后,你会感觉到什么叫差距)
- 感觉好多人做车牌识别,小弟我有一小问题请教,征求大家讨论一下。
- 【散分】终于做了完了作业,但是感觉很是不爽,有个问题大家讨论一下。。。
- 文本搜索问题,如何能将速度达到最快,大家讨论一下,感觉很复杂哦!




