Шаг 215 - Познакомимся поближе с CObject

Посмотрите иерархию классов MFC и Вы увидите, что очень много объектов порождено от CObject. Так как он находится в самом верху иерархии классов, то естественно он обеспечивает только самые базовые возможности для объекта. К базовым возможностям относятся вот какие:

Всего функций в классе немного вот они:

// --------------- Конструктора объекта
CObject( );			// Конструктор по умолчанию
CObject( constCObject& objectSrc );	// Конструктор копий
void* operator new( size_t nSize );	// Оператор создания объекта
throw( CMemoryException );
void* operator new( size_t nSize, LPCSTR lpszFileName, int nLine ); // Второй вариант создания объекта
throw( CMemoryException );
void operator delete( void* p );	// Оператор удаления объекта
void operator =( const CObject& src );// Оператор получения копии
// -------------- Диагностика
virtual void AssertValid( ) const;	// Проверка состояния объекта
virtual void Dump( CDumpContext& dc ) const; // Получения информации об объекте
// -------------- Сохранение обьекта
BOOL IsSerializable( ) const;	// Проверка возможности сохранения объекта
virtual void Serialize( CArchive& ar );// Сохранение объекта
throw( CMemoryException );
throw( CArchiveException );
throw( CFileException );
//--------------- Дополнительные функции
virtual CRuntimeClass* GetRuntimeClass( ) const; // Возвращает информацию о классе
BOOL IsKindOf( const CRuntimeClass* pClass ) const; // Проверка получен ли объект из данного класса

Как видите в классе CObject собраны только функции, которые отвечают за существование объекта и больше ничего. Сами смотрите. Можно создать, сохранить, восстановить, сделать копию, проверить состоянии и все. Это каркас, который умеет существовать в компьютерной системе, и на который надо добавлять свои функции. При этом этот каркас приспособлен под жизнь вместе с MFC. Вы как программист обычно применяете наследования, чтобы добавить к этому классу функциональности. Давайте будем постепенно проводить наследование. Вот самый простой вариант.

#include "stdafx.h"
#include "afxwin.h"
#include "iostream.h"

class CMyObject : public CObject
{
};

void main()
{
	CMyObject* myObj = new CMyObject; 
}

Мы класс CMyObject как потомок от CObject. Но наш класс пока ничего не умеет. Он просто появляется в программе. Дело в том несмотря ни на что он еще мертвый. Все функции, которые определены в нем виртуальные. У них нет реализации. Вот пример кода из Afx.Inp:

......
_AFX_INLINE void CObject::AssertValid() const
	{ /* no asserts in release builds */ }
_AFX_INLINE void CObject::Dump(CDumpContext&) const
	{ /* no dumping in release builds */ }
......

Нам надо оживить его. Функция за функцией для того, чтобы он смог жить в мире MFC. На вопрос с чем связано отсутствие реализаций функций прост. Дело в том, что класс абсолютно абстрактный, так как не имеет данных. Чего сохранять ??? Чего проверять ???? Нечего. Это просто шаблон, который говорит Вам, что надо делать так.


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