如何用访问如下方法创建的对象中的域?(50分)

  • 主题发起人 主题发起人 liangliang
  • 开始时间 开始时间
onstructor tchild.create(Aparent:tfather);
begin
inherited;
if Aparent = nil then
Aparent := tfather.create;
Aparent.add(self);//if Aparent is tlist我觉得多余了。
end;

??????
if aparent = nil then

退出之后Tchild放哪去了? //是在aparent中,
// 那么Aparent呢?
// 您通过什么去访问这个aparent呀?
// 再为这个aparent建立一个TFather???
所以TChild.constructor中根本不必有aparent这个参数, aparent应该是一个
全局变量.
另外我说没必要另建一个TFather是考虑到这个TFather比较难写. 除了需要
override Destroy之外你还漏了override一个重要的过程Notification, 否则我们
考虑一下如下情况, create 了一个TChild, 然后free这个TChild会怎么样?
会在TFather中留下了一个无效指针, 等你真正free TFather时会出现access violate. 想解决这个问题, 要么override TFather.Notification过程(这
样要求你的TChild.owner必须为TFather). 要么override TChild.Destroy, 在
那里将father中的指针置nil或delete it. 这样只要求你的father是一个全局变量. 这种情况下根本没必要有个TFather, 直接用TList不一样吗?
代码如下:
var
Father: TList;
....
constructor TChild.Create;
begin
inherited;
if not assigned(father) then
father := tlist.create;
father.add(self);
end;

destructor TChild.Destroy;
begin
if assigned(father) then
begin
father.delete(father.indexof(self));
if father.count = 0 then
freeandnil(father);
end;
inherited;
end;
 
不用在讨论了吧?
Tlist 本来就是干这个用(动态对象)的吗。
 
To liangliang:
你是对得,改你得程序时没仔细想。Sorrry! {B-(
 
To Another_eYes:
问:退出之后Tchild放哪去了? //是在aparent中,
答:是啊。
问:// 那么Aparent呢?
答:Aparent就是传入的Father啊,因为Delphi都是用指针传送对象的。

问:// 您通过什么去访问这个aparent呀?
答:当然通过Father。
问:// 再为这个aparent建立一个TFather???
答:为什么?
我想你也许没看清我动态创建对象时用的方法:
with tchild.create(father)do
.. (可是将全局变量Father作为参数传入的哦.)
当然你的方法也可以,只是你不觉得这样作太死了吗?一定要将Father作死在Tchild.create
里,也就是说,我要用Tchild就必须要先定义一个叫Father的变量,那末Father1,Father2..就不可以
了吗?或者我要建两个呢? 用参数传入不是更灵活些吗?

问:'考虑一下如下情况, create 了一个TChild, 然后free这个TChild会怎么样?会在TFather中留
下了一个无效指针, 等你真正free TFather时会出现access violate. '
答:我认为并不用担心那种事情的发生,因为:
'Unlike Destroy, Free is successful even if the object is nil, so if the object was never initialized, Free won抰 result in an error.' ----from Delphi online help.
也就是说,即便已经free过了,再free一次也不会出错。free会自动处理这种情况,不信你试试。

 
To liangliang:
1: 对,father可以为多个全局变量
2:调用Free并不会使对象为nil,所以再次Free时必出错!
3: Another_eYes的方法已经够完全了,没必要再争了!

 
同意沈前卫所说的.
另外我想指出该程序还有的两个错误:
1.tchild的Create不能override,因为它是从Tobject继承过来的。
2.此外Tchild的create最好用var传递参数,
即constructor tchild.create(var Aparent:tfather);
因为在构造Tchild时,若father对象尚未建立则Aparent将不用指针传送,这将导致
Aparent:=tfather.create编译出错。
没想到区区50分竟还能引来百人围观,其实该问题源自我最近在作的一个游戏
所涉及的动态创建问题。好了,还是多谢各位的指教。
'分'发了。
 
后退
顶部