关于TCollection / TMetaClass的问题,非常奇怪,请高人指点,多谢!

SurfCaster 2002-11-29 05:32:22
TCollection
|
A

TCollectionItem
|
B
=======================================================================
__fastcall A::A(TComponent* Owner) : TCollection(__classid(B))
{

}

B* A::Add(void)
{
return (B*)(inherited::Add());
}
=======================================================================
__fastcall B::B(A *Owner) : TCollectionItem(Owner)
{
......
}
=======================================================================
现在发现一个奇怪的现象:
A *a;
B *b;
.....
b = a->Add();
虽然新增加了一个item,但B的构造函数似乎没有执行

TCollection的构造函数__fastcall TCollection(TMetaClass* ItemClass);
其参数TMetaClass*,我用__classid(B)应该是正确的吧?

为什么a->add()新开辟了B的内存空间,可是却没有调用B的构造函数呢?

真的很奇怪,请高人指点
...全文
76 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
SurfCaster 2002-12-01
  • 打赏
  • 举报
回复
高手都放假了吗?
SurfCaster 2002-11-30
  • 打赏
  • 举报
回复
有人吗?
SurfCaster 2002-11-30
  • 打赏
  • 举报
回复
有没有人能提供帮助?
SurfCaster 2002-11-30
  • 打赏
  • 举报
回复
谁能帮解释一下以下语句的含义么?
TCollectionItem* &Item

TCollectionItem类引用变量的指针?
SurfCaster 2002-11-30
  • 打赏
  • 举报
回复
参照以下TListColumns的代码
function TListColumns.Add: TListColumn;
begin
Result := TListColumn(inherited Add);
end;

这是我的代码
B* A::Add(void)
{
return (B*)(inherited::Add());
}

刚跟踪调试,发现确实没有调用B的构造函数,而是调用了TCollectionItem的构造函数,我改代码如下:
B* A::Add(void)
{
TCollectionItem *pNewItem = inherited::Add();
B *pNewB = new B(this);
pNewItem->Assign(pNewB); //在这里出错
return pNewB;
}
我该怎么改?
为什么delphi可以用Result := TListColumn(inherited Add);?它是怎么自动调用TListColumn的构造函数的?
invalid 2002-11-30
  • 打赏
  • 举报
回复
没有看到哪里调用new了啊?
SurfCaster 2002-11-29
  • 打赏
  • 举报
回复
这是最简化的代码,应该可以反映问题了吧
warton 2002-11-29
  • 打赏
  • 举报
回复
代码能完整一点吗?

13,825

社区成员

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

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