是友元问题吗?

阿发伯 2003-10-18 11:39:10
在下面这个帖中所提出的问题,究竟是不是友元问题,欢迎讨论。
http://expert.csdn.net/Expert/topic/2363/2363045.xml?temp=.4442407

我个人认为这个问题不是友元问题,所谓友元类,必须是两个类之间的关系,TComponent和TComponent是两个不同的类吗?显然不是,所以楼主的问题只能解释为一个类对自身的实例引用,对自身的实例引用当然可以访问其私有成员。这个问题在C++的操作符重载中经常见到,因为在C++中的友元关系必须用关键字定义,所以很明确,也没有听说或在那本书上看到这是个友元问题,只是解释为“一个类对自身的实例引用”。所谓“自己和自己肯定是友员”的解释是不正确的,说“自己和自己类似友元关系”到可以说得过去。
当然我的见解也可能不正确或者不完整,希望大家能引经据典的把这个问题搞清楚!
...全文
109 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿发伯 2003-11-01
  • 打赏
  • 举报
回复
看样子这个问题无法讨论明白,我只好自己做个结论后结账,平均给分吧!
结论:
按照各种Delphi上说,Delphi中没有明确定义友元,但是具有类似友元的功能,即同一个单元中定义的类互为友元,对同一单元中不同的类相信大家没有异议,但对于一个类对本身实例的引用,有两种看法,一种是认为这也是友元关系,理由是既然同一个单元中定义的类互为友元,一个类对自身实例的引用可看作特殊的友元关系,或者干脆说“自己和自己肯定是友员”;另一种看法则认为这只能叫“对自身实例的引用”,不是什么友元关系,理由是既然Delphi中没有明确定义友元关系,可以比照其他OO语言,如C++来说明这个问题,C++对于友元关系的定义必须使用friend关键字,而一个类中往往大量使用对自身实例的引用,如拷贝构造函数、运算符重载等,由于没有关键字定义,不能说是友元关系,事实上也从没有任何人或资料说这是一种友元关系,只是说是自身实例的引用。
现在这两种看法,应该说都有道理,又都道理不够充分,而且没有谁能真正“引经据典”把这个问题说透彻,只好去问Borland了,但是不管怎样,如果一个类不能引用自身实例,实在是说不过去,是友元也好,不是也罢,无论是Delphi,还是C++,大家都这么用,我们就这么用吧!
不过,如果不是原帖的楼主已经部分的理解错误(我自己的认为),我是不会浪费200分来发这个帖的(不过分多并不心疼),请看原帖楼主的部分理解,我就不评论了,谁有兴趣谁去分析他理解了什么:



(3)insert 可以看作 Classes 单元中 所有定义类的一个友元函数。
(4)insert 最后被派生类继承了(的确继承了,但是在派生类中不能访问,因为他是私有的),
(5)insert 是classes中所定义的的类的友元函数 这一点在TComponet的派生类是没有变化的。
(6)Insert 仅能访问classes中所定义的的类的私有数据,不能访问派生类的私有数据。
ly_liuyang 2003-10-21
  • 打赏
  • 举报
回复
只能同一PAS内是友员
大地精灵 2003-10-21
  • 打赏
  • 举报
回复
做个标记,晚上想想
FrameSniper 2003-10-21
  • 打赏
  • 举报
回复
Delphi中友元的定义是什么,只要是在一个Unit中定义的类就可以互相成为友员类。所以个人认为一个Unit中定义的某个类和自己可以做为一种特殊的友员关系!

Linux2001 2003-10-21
  • 打赏
  • 举报
回复
FrameSniper(§绕瀑游龙§) 已经回答了我想说的了
toyjoy 2003-10-20
  • 打赏
  • 举报
回复
学习!
hmily1688 2003-10-20
  • 打赏
  • 举报
回复
Delhpi/Kylix规定,所有出现在一个单元内的类(这肯定是不同的类了)互为友元,且该单元中的所有全局函数都是该单元声明的类的友元函数,它们可以访问类的私有数据域
hmily1688 2003-10-20
  • 打赏
  • 举报
回复
同意楼主的看法。
HiMrXia 2003-10-19
  • 打赏
  • 举报
回复
constructor TComponent.Create(AOwner: TComponent); 中AOwner姑且看作容器A
if AOwner <> nil then AOwner.InsertComponent(Self); 将TComponent加入容器A

Insert(AComponent); 传递的是容器A

FComponents.Add(AComponent); 将容器A加入TList

AComponent.FOwner := Self; 将TComponent赋给容器A的FOwner,当然是合法的,不是什么友元之类问题,(Delphi中没有真正意义上的友元)
leapmars 2003-10-19
  • 打赏
  • 举报
回复
楼主的理解是对的!

在类的作用域内访问自身实例的私有成员是没有问题的。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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