buanhui 发表于 2003-6-3 16:34:00

多谢各位版主和大侠的厚爱,小弟不胜感激,AcDbmyEntity::cast(pEntity)调用出错

AcDbEntity *pEntity;
AcDbmyEntity::cast(pEntity)->getRLpoints(towPts);//
当我编译运行时报错误,请问cast()是否要在AcDbmyEntity中重载?
需重载的话该如何重载?
如果不需重载,那是否我调用形式不对?
如果不对,正确调用形式该怎样?

leeyeafu 发表于 2003-6-4 10:49:00

没有看到你的派生类定义,你看看是不是这样

本帖最后由 leeyeafu 于 2003-6-4 10:49:47 编辑

首先,你的类AcDbmyEntity应该派生自AcDbEntity类。派生类的cast(),desc()等公共函数的声明可以用宏ACRX_DECLARE_MEMBERS()实现。因此,你的派生类定义应该包括这样的代码:
class AcDbmyEntity:public AcDbEntity
{
public:
ACRX_DECLARE_MEMBERS(AcDbmyEntity);
...
}
通常,定义了ACRX_DECLARE_MEMBERS()宏后,不需要重载cast()等函数。
另外,在调用AcDbmyEntity::cast(pEntity)之前,最好先检查指针pEntity是否为AcDbmyEntity类型,否则,即使编译时不出错误,也会出现运行时错误。
ACRX_DECLARE_MEMEBERS()宏声明的cast()函数是这样子的:
static AcDbmyEntity* cast(AcRxObject * inPtr)
{
return ((inPtr==0)||!inPtr->isKindOf(AcDbmyEntity::desc()))
          ?0:(AcDbmyEntity*) inPtr;
}
从以上代码看到,若pEntity不是AcDbmyEntity类型,cast()函数返回空指针(或者说0指针),而0->getRLpoints(towPts);必然出错。
类型检查代码我相信你会写,不过其他人可能不熟悉。
AcDbEntity *pEntity;
if(pEntity->isKindOf(AcDbmyEntity::desc())
AcDbmyEntity::cast(pEntity)->getRLpoints(towPts);//
这样,可能不会出错了。你试试。
页: [1]
查看完整版本: 多谢各位版主和大侠的厚爱,小弟不胜感激,AcDbmyEntity::cast(pEntity)调用出错