讨论:TComponent::Owner是怎么实现的?
lyghe 2002-05-30 04:04:02 每一个TComponent的子类,其属性中必有一个TComponent *Owner,和一个数组TComponent* Components[int Index],其构造函数必有一个参数为TComponent *AOwner。CB对其解释为:
When one component owns another, the memory for the owned component is freed when its owner's memory is freed.
言下之意,只要Onwer被删除,全部被其owned的Components[0..n]的对象都将被删除。
那么这是怎么实现的呢?
我的理解是:在构造函数中,根据参数调用其Onwer的某个函数,使自身在其Owner的Components数组中被记录下来。而Owner在析构函数中访问这个数组,删除这个列表中记录的owned component。像这样:
owner owned component
构造函数(TComponent *AOwner)
|
调用AOwner->管理函数(this)
|
-------------------------------------
|
在数组Components[]中记录下owned component
......
析构函数
|
访问数组Components[],删除所有owned component
如果真是这样的话,问题就来了:
如果动态创建一个TComponent *pNew,必然要在其构造函数中给定另外一个TComponent *pOld的指针作为AOwner。如果以后想删除这个pNew,应该怎么删除?
直接用delete必然会引起pNew->Owner中的指针指向无意义的地址,当pOld删除时将引起混乱。这已经在我的程序中证实了。
那么是不是应该在删除pNew的同时维护pNew->Owner->Components呢?不行,因为是只读的,而且这样不符合面向对象思想。
这样看来,只有调用pNew的某个函数,让它自己来删除自己,因为在那个函数中它删除自身之前还是可以调用其Owner的另外一个函数来维护那个数组的。遗憾的是我没有找到这样一个函数。
也许我的猜测只是一种臆断,请各位斧正。