Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2341549
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:06:24

初学者又来打扰。

我现在使用TStrings类,用AddItem方法将其中的每一个字符串和一个TComponent类的派生类,假设为TMyClass关联;
1:AddItem方法要求的第二个参数为TObject*型的,我用AddItem("String1",pTMyClass),也就是直接用一个指向派生类的指针作为参数;
2:程序的其他地方需要用到这些派生类的指针,比如Function1(TMyClass*,.....),我用
Function1(myTStrings->Items->Object[Index],...),由于第一个参数是一个TObject*类型的指针,编译器提示有错,Cannot Convert "TObject*" to "TMyClass*",和Type MisMatch错误.
我就加了一个强制类型转换,(TMyClass*)myTStrings->Items->Object[Index],编译通过,程序也可以运行。
我想问,这两次的类型转换是否安全;另外我在很多程序里看到用dynamic_cast 作类型转换,这和直接用(TMyCalss *)强制转换有什么区别。

还有,我在程序里多次用new 动态创建了很多的VCL对象,构造函数里面都有一个参数(Owner),我是否需要自己用delete 删除这些对象。还是Owner消除时会自动释放这些对象占用的内存。

请版主指教。
































--------------------next---------------------
The Owner of a component is responsible for two things:

·The memory for the owned component is freed when its owner's memory is freed.
This means that when a form is destroyed, all the components on the form are also destroyed.

·The Owner is responsible for loading and saving the published properties of its owned controls.

前面的是说如果拥有者释放内存,拥有的控件随之释放内存
后面的是说控件的可视化属性(控件安装在属性页里面的属性)随拥有者的可视化属性装载和储存

虽然控件可以随着拥有者释放内存,但是有很多情况下必须手动释放内存:
手动创建的拥有者是 Application (应用程序), MainForm (主窗口), Auto Created Form (程序运行自动创建的窗口)。
因为这些拥有者在程序的运行中不释放内存,只有程序结束时才释放内存,
如果你不停的创建这些拥有者拥有的控件,这些控件在程序结束之前不停的占用内存,程序不结束不释放内存,导致极度浪费资源。


有关类型转换的问题:
如果你已经知道类型了,强制类型转换是没问题的,例如你说的你给 TObject* 赋值 TMyClass*, 然后再赋值回来进行强制转换。
如果不知道类型,就必须用 dynamic_cast 进行类型转换。

例如:
class TMyBase;
class TMyClassA: public TMyBase;
class TMyClassB: public TMyBase;
//上面的 TMyClassA 和 TMyClassB 都是由 TMyBase 继承的,这说明 TMyClassA 指针 和 TMyClassB 指针都可以给 TMyBase 赋值:

TMyClassA *ca = new TMyClassA;
TMyClassB *cb = new TMyClassB;

//定义一个有 TMyBase 的指针的函数, 这个函数即可以用 TMyBase* 参数,又可以用 TMyClassA* 和 TMyClassB* 参数
void MyFunc(TMyBase *pbase);

MyFunc(ca); //用 TMyClassA 指针参数
MyFunc(cb); //用 TMyClassB 指针参数

//现在 void TMyFunc(TMyBase *pbase) 函数里面就不清楚传进来的参数是 TMyBase, TMyClassA, TMyClassB 当中的哪种类型了

void MyFunc(TMyBase *pbase)
{
  TMyClassA *pa = dynamic_cast(pbase); //如果参数是 TMyClassA 类型的,就赋值给 pa, 否则 pa = NULL
  TMyClassB *pb = dynamic_cast(pbase); //如果参数是 TMyClassB 类型的,就赋值给 pb, 否则 pb = NULL

  if(pa) //如果是 TMyClassA 类型的
   {
   }
  else if(pb) //如果是 TMyClassB 类型的
   {
   }
  else //不是 TMyClassA, 也 不是 TMyClassB, 如果没有其他的 TMyBase 的继承的类,就是直接由 TMyBase 定义的变量
   {
   }
}

--------------------next---------------------

阅读(1109) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~