Шаг 218 - Макрос RUNTIME_CLASS

Этот класс используется для того, чтобы получить структуру 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;
	}
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 16.08.2000