在下面这个帖中所提出的问题,究竟是不是友元问题,欢迎讨论。
http://expert.csdn.net/Expert/topic/2363/2363045.xml?temp=.4442407    我个人认为这个问题不是友元问题,所谓友元类,必须是两个类之间的关系,TComponent和TComponent是两个不同的类吗?显然不是,所以楼主的问题只能解释为一个类对自身的实例引用,对自身的实例引用当然可以访问其私有成员。这个问题在C++的操作符重载中经常见到,因为在C++中的友元关系必须用关键字定义,所以很明确,也没有听说或在那本书上看到这是个友元问题,只是解释为“一个类对自身的实例引用”。所谓“自己和自己肯定是友员”的解释是不正确的,说“自己和自己类似友元关系”到可以说得过去。
    当然我的见解也可能不正确或者不完整,希望大家能引经据典的把这个问题搞清楚!

解决方案 »

  1.   

    constructor TComponent.Create(AOwner: TComponent);  中AOwner姑且看作容器A
    if AOwner <> nil then AOwner.InsertComponent(Self); 将TComponent加入容器AInsert(AComponent); 传递的是容器AFComponents.Add(AComponent);  将容器A加入TListAComponent.FOwner := Self;  将TComponent赋给容器A的FOwner,当然是合法的,不是什么友元之类问题,(Delphi中没有真正意义上的友元)
      

  2.   

    Delhpi/Kylix规定,所有出现在一个单元内的类(这肯定是不同的类了)互为友元,且该单元中的所有全局函数都是该单元声明的类的友元函数,它们可以访问类的私有数据域
      

  3.   

    Delphi中友元的定义是什么,只要是在一个Unit中定义的类就可以互相成为友员类。所以个人认为一个Unit中定义的某个类和自己可以做为一种特殊的友员关系!
      

  4.   

    FrameSniper(§绕瀑游龙§) 已经回答了我想说的了
      

  5.   

    看样子这个问题无法讨论明白,我只好自己做个结论后结账,平均给分吧!
    结论:
        按照各种Delphi上说,Delphi中没有明确定义友元,但是具有类似友元的功能,即同一个单元中定义的类互为友元,对同一单元中不同的类相信大家没有异议,但对于一个类对本身实例的引用,有两种看法,一种是认为这也是友元关系,理由是既然同一个单元中定义的类互为友元,一个类对自身实例的引用可看作特殊的友元关系,或者干脆说“自己和自己肯定是友员”;另一种看法则认为这只能叫“对自身实例的引用”,不是什么友元关系,理由是既然Delphi中没有明确定义友元关系,可以比照其他OO语言,如C++来说明这个问题,C++对于友元关系的定义必须使用friend关键字,而一个类中往往大量使用对自身实例的引用,如拷贝构造函数、运算符重载等,由于没有关键字定义,不能说是友元关系,事实上也从没有任何人或资料说这是一种友元关系,只是说是自身实例的引用。
        现在这两种看法,应该说都有道理,又都道理不够充分,而且没有谁能真正“引经据典”把这个问题说透彻,只好去问Borland了,但是不管怎样,如果一个类不能引用自身实例,实在是说不过去,是友元也好,不是也罢,无论是Delphi,还是C++,大家都这么用,我们就这么用吧!
        不过,如果不是原帖的楼主已经部分的理解错误(我自己的认为),我是不会浪费200分来发这个帖的(不过分多并不心疼),请看原帖楼主的部分理解,我就不评论了,谁有兴趣谁去分析他理解了什么:
      
    (3)insert 可以看作 Classes 单元中 所有定义类的一个友元函数。
    (4)insert 最后被派生类继承了(的确继承了,但是在派生类中不能访问,因为他是私有的),
    (5)insert 是classes中所定义的的类的友元函数 这一点在TComponet的派生类是没有变化的。
    (6)Insert 仅能访问classes中所定义的的类的私有数据,不能访问派生类的私有数据。