Этот класс используется для того, чтобы получить структуру CRuntimeClass с именем класса. Эту структуру возвратят только объекты объявленные как:
DECLARE_DYNAMIC DECLARE_DYNCREATE
Описан этот макрос как:
RUNTIME_CLASS( имя класса ) //Имя класса фактическое не заключенное в кавычки
На место этого макроса компилятор поставит код. Вот такой:
#define RUNTIME_CLASS(class_name) \ ((CRuntimeClass*)(&class_name::class##class_name))
Модернизация прошлого примера с учетом RUNTIME_CLASS и тем, что он возвращает ссылку на CRuntimeClass.
void main() { CMyObject* myObj = new CMyObject; CRuntimeClass* pClass = RUNTIME_CLASS(CMyObject); if (myObj->IsKindOf(pClass)) cout << "CMyObject Class" << endl; else cout << "Not CMyObject Class" << endl; }
Используя этот макрос объект можно создавать динамически не используя оператора new, вот пример. Можно рассматривать это как альтернативный метод создания объекта. Но только в том случае, если в объвлении класса используется макрос DECLARE_DYNCREATE.
#include "stdafx.h" #include "afxwin.h" #include "iostream.h" class CMyObject : public CObject { protected: DECLARE_DYNCREATE(CMyObject) }; IMPLEMENT_DYNCREATE(CMyObject,CObject); void main() { CRuntimeClass* pClass = RUNTIME_CLASS(CMyObject); CObject* myObj = pClass->CreateObject(); ASSERT(myObj); if (myObj->IsKindOf(pClass)) cout << "CMyObject Class" << endl; else cout << "Not CMyObject Class" << endl; }
Вот вывод такой. Мы можем создать функцию, которая будет создавать любой объект в зависимости от параметров. Давайте сделаем для понимания.
#include "stdafx.h" #include "afxwin.h" #include "iostream.h" class CMyObject : public CObject { protected: DECLARE_DYNCREATE(CMyObject) }; IMPLEMENT_DYNCREATE(CMyObject,CObject); class CAlternativeObject : public CObject { protected: DECLARE_DYNCREATE(CAlternativeObject) }; IMPLEMENT_DYNCREATE(CAlternativeObject,CObject); void CreateAllObject(CRuntimeClass* pClass); void main() { CreateAllObject(RUNTIME_CLASS(CMyObject)); CreateAllObject(RUNTIME_CLASS(CAlternativeObject)); } void CreateAllObject(CRuntimeClass* pClass) { CObject* myObj; myObj= pClass->CreateObject(); ASSERT(myObj); if (myObj->IsKindOf(RUNTIME_CLASS(CMyObject))) cout << "CMyObject Class" << endl; else { if (myObj->IsKindOf(RUNTIME_CLASS(CAlternativeObject))) cout << "CAlternativeObject Class" << endl; else cout << "Not Info Class" << endl; } }