Тема: Определение типа класса

В проекте определено несколько классов реакторов.
Есть объект, к которому прикреплен реактор. Собственно нужно определить к какому классу реактор относится.
Встречал на форуме где-то варианты сравнения наподобие
if ( XX_cast<имя_нужного_класса>(объект) ... )
Собственно это и нужно, только вот что-то никак не могу найти где я это видел.
AcDbEntity* ent;
AcDbVoidPtrArray* arr;
arr = ent->reactors();
ent = (AcDbEntity*)arr->at(0);
далее надо определить к какому типу относится реактор
if ( .. )
Подскажите, пожалуйста, кто знает

Re: Определение типа класса

Тут какая-то ерунда:

AcDbEntity* ent;
AcDbVoidPtrArray* arr;
arr = ent->reactors();
ent = (AcDbEntity*)arr->at(0);

В результате ent получится равным 0, так как классы реакторов не производные от AcDbEntity.
Если класс реактора например ReactorClass, то проверять можно так:

ReactorClass *react = ReactorClass::cast(arr->at(0));
if (react != NULL) {
// Это твой реактор - можешь работать
}

Re: Определение типа класса

да, то что надо, только мне удается почему-то у себя без ошибок это завести.
1. при попытке скомпилировать как у Вас показано, компилируется с ошибкой error C2664: 'PostReactor::cast' : cannot convert parameter 1 from 'void *' to 'const AcRxObject *'
2. Всевозможные преобразования типов, позволяющие убрать эту ошибку,
наподобие таких:
(AcDbObject*)arr->at(0)
(AcRxObject*)arr->at(0) или
((AcDbObject*)arr->at(0))->isA()
приводят к ошибкам при выполнении
Unhandled exception at 0x7b68683e in acad.exe: 0xC0000096: Privileged instruction. в функции
inline bool AcRxObject::isKindOf(const AcRxClass* pOtherClass) const
{
->->const AcRxClass * pMyClass = this->isA();
    return pMyClass == NULL ? false : pMyClass->isDerivedFrom(pOtherClass);
}
в первых двух случаях, и просто violation в третьем.
Собственно вот описание класса реактора:
class PostReactor : public AcDbObject
{
public:
    ACRX_DECLARE_MEMBERS( PostReactor );
    PostReactor() {};
    void openedForModify( const AcDbObject* );
    void modified( const AcDbObject* );
};
ACRX_DXF_DEFINE_MEMBERS(PostReactor, AcDbObject, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 0, PostReactor, MainSolution);
Мне не очень понятно назначение ACRX_DECLARE_MEMBERS и ACRX_DXF_DEFINE_MEMBERS, может дело в них?

Re: Определение типа класса

> mk
А утверждение ar.length() > 0 верно?

Re: Определение типа класса

отладчик показывает длину массива logicalLength = 1;

Re: Определение типа класса

Вот кусочек из ObjectARX SDK Help:

AcDbVoidPtrArray *pReactors;
void             *pSomething;
AcDbObjectReactor *pObjReactor;
AcDbObjectId       persObjId;
AcDbObject        *pPersReacObj;
pReactors = pEnt->reactors();
if (pReactors != NULL && pReactors->length() > 0) {
    for (int i = 0; i < pReactors->length(); i++) {
        pSomething = pReactors->at(i);
        // Is it a persistent reactor?
        //
        if (acdbIsPersistentReactor(pSomething)) {
            persObjId = acdbPersistentReactorObjectId(
                pSomething);
            acutPrintf("\n\nPersistent reactor found.");
            // Echo the keyname to the user.
            //
            char *keyname = NULL;
            getPersReactorKey(keyname, persObjId);
            if (keyname) {
                acutPrintf("\nThis is the reactor named %s",
                keyname);
                free (keyname);
            }
            // Open it up and see if it's one of ours. If it is,
            // fire the custom notification.
            //
            if ((retStat =
                acdbOpenAcDbObject(pPersReacObj,
                persObjId, AcDb::kForNotify))
                != Acad::eOk)
            {
                acutPrintf("\nFailure for"
                    " openAcDbObject: retStat==%d\n",
                    retStat);
                return;
            }
            AsdkPersReactor *pTmpPers;
            if ((pTmpPers =
                AsdkPersReactor::cast((AcRxObject*)
                pPersReacObj)) != NULL)
            {
                pTmpPers->custom();
            }
            pPersReacObj->close();
        } else {
            // Or is it transient?
            //
            pObjReactor = (AcDbObjectReactor *)
                          (pReactors->at(i));
            acutPrintf("\n\nTransient Reactor found");
            // Report what kind we found.
            //
            if (pObjReactor->isKindOf(
                AsdkSimpleObjReactor::desc()))
            {
                acutPrintf(" of type"
                    " AsdkSimpleObjReactor");
            } else if (pObjReactor->isKindOf(
                AcDbEntityReactor::desc()))
            {
                acutPrintf(" of type"
                    " AcDbEntityReactor");
            } else if (pObjReactor->isKindOf(
                AcDbObjectReactor::desc()))
            {
                acutPrintf(" of type"
                    " AcDbObjectReactor");
            } else {
                acutPrintf(" of unknown type.");
            }
        }
    }
} else {
    acutPrintf("\nThis entity has no reactors.\n");
}

Думаю теперь тебе станет понятнее в чем у тебя проблема.

Re: Определение типа класса

Спасибо большое, все заработало.
Жаль что сам не нашел этого в help'e.