初学者又来打扰。
我现在使用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) |