Почему DECLARE_DYNAMIC & amp; IMPLEMENT_DYNAMIC nessary для DYNAMIC_DOWNCAST?

У меня есть два класса:

/*Switch.h*/
class CSwitch : public CDeviceEntity {}
/*EndSystem.h*/
class CEndSystem : public CDeviceEntity {}

но когда я использую:

CDeviceEntity* dev = NULL;
dev = topo->headList[i]->node;
if ( DYNAMIC_DOWNCAST( CEndSystem, dev ) != NULL ) {}

«DYNAMIC_DOWNCAST«всегда возвращается not NULL в то время как dev вроде class CEndSystem или же class CSwitch,

Если использовать:

/*Switch.h*/
class CSwitch : public CDeviceEntity { DECLARE_DYNAMIC(CSwitch) }
and
/*Switch.cpp*/
IMPLEMENT_DYNAMIC(CSwitch, CDeviceEntity)
/*EndSystem.h*/
class CEndSystem : public CDeviceEntity { DECLARE_DYNAMIC(CEndSystem) }
and
/*EndSystem.cpp*/
IMPLEMENT_DYNAMIC(CEndSystem, CDeviceEntity)

«DYNAMIC_DOWNCAST«возвращается NULL или же not NULL в соответствии с class CEndSystem или же class CSwitch,

Зачем «DECLARE_DYNAMIC» а также «IMPLEMENT_DYNAMIC«необходимы для»DYNAMIC_DOWNCAST«?

/*Algorithm.h*/
static int getESNum();

/*Algorithm.cpp*/
int CAlgorithm::getESNum()
{
int count = 0;
CDeviceEntity* dev = NULL;
for (int i = 0; i < topo->nodeNum; i++)
{
dev = topo->headList[i]->node;
if ( DYNAMIC_DOWNCAST( CEndSystem, dev ) != NULL )
{
count++;
}
}

return count;
}

/*Algorithm.h*/
static int getSWNum();

/*Algorithm.cpp*/
int CAlgorithm::getSWNum()
{
int count = 0;
CDeviceEntity* dev = NULL;
for (int i = 0; i < topo->nodeNum; i++)
{
dev = topo->headList[i]->node;
if ( DYNAMIC_DOWNCAST(CSwitch, dev) != NULL )
{
count++;
}
}

return count;
}

И функции вызываются в сериализации при сохранении документа.

1

Решение

DYNAMIC_DOWNCAST — это возвращение к тому, как раньше вы делали динамическое приведение RTTI информация была доступна от компилятора. Информация о приведении создается с помощью макросов DECLARE_DYNAMIC и IMPLEMENT_DYNAMIC, которые используют класс CRuntimeClass, чтобы определить, является ли приведение действительным.

DYNAMIC_DOWNCAST просто делает это:

CObject* AFX_CDECL AfxDynamicDownCast(CRuntimeClass* pClass, CObject* pObject)
{
if (pObject != NULL && pObject->IsKindOf(pClass))
return pObject;
else
return NULL;
}

Макрос DECLARE_DYNAMIC добавляет этот код:

#define DECLARE_DYNAMIC(class_name) \
protected: \
static CRuntimeClass* PASCAL _GetBaseClass(); \
public: \
static const CRuntimeClass class##class_name; \
static CRuntimeClass* PASCAL GetThisClass(); \
virtual CRuntimeClass* GetRuntimeClass() const; \

Добавить IMPLEMENT_DYNAMIC добавляет этот код:

#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew, class_init) \
CRuntimeClass* PASCAL class_name::_GetBaseClass() \
{ return RUNTIME_CLASS(base_class_name); } \
AFX_COMDAT const CRuntimeClass class_name::class##class_name = { \
#class_name, sizeof(class class_name), wSchema, pfnNew, \
&class_name::_GetBaseClass, NULL, class_init }; \
CRuntimeClass* PASCAL class_name::GetThisClass() \
{ return _RUNTIME_CLASS(class_name); } \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return _RUNTIME_CLASS(class_name); }

#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL, NULL)

Я думаю, что мало кто все еще использует это для новых проектов, вместо этого предпочитая стандарт C ++ dynamic_cast<> позвонить (вместе с static_cast а также reinterpret_cast).

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]