• 全部
...

讨论: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的另外一个函数来维护那个数组的。遗憾的是我没有找到这样一个函数。

也许我的猜测只是一种臆断,请各位斧正。
...全文
给本帖投票
124 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
mygodness 2002-05-30
  • 打赏
  • 举报
回复
我认为没有必要,即使是动态创建的,它的构造和析构函数一样很好地处理

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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

手机看
关注公众号

关注公众号

客服 返回
顶部