Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
38
Добавлен:
16.02.2016
Размер:
544.77 Кб
Скачать

Методы и переменные класса cObject

CObject::CObject ();

CObject::CObject (const CObject& objectSrc);

Конструкторы класса. Первый считается конструктором по умолчанию.

Отметим, что если производный класс поддерживает возможность сериализации, то он обязательно должен содержать в объявлении класса конструктор без параметров (но доступ к нему предоставлять не обязательно).

Параметры:

objectSrc - ссылка на другой CObject.

void* CObject::operator new(size_t nSize); throw(CMemoryException);

void* operator new(size_t nSize, LPCSTR ipszFileName, int nLine);

throw(CMemoryException);

Эти методы реализованы по-разному для конфигураций Release и Debug. При отладке используется схема выделения памяти, позволяющая определять "потери" памяти.

Для использования оператора new в отладочном режиме в файл .СРР вставляется строка кода: #define new DEBUG_NEW.

void CObject::operator delete (void* p);

Метод, выполняющий освобождение памяти при удалении объекта. Peaлизация этого метода также различна для конфигураций Release и Debug. void CObject::operator = (const CObject& src);

Оператор присваивания, выполняющий копирование члена класса на член класса.

virtual void CObject::AssertValid () const;

Метод выполняет проверку правильности объекта, контролируя его внутреннее состояние. При конфигурации Debug этот метод может прервать выполнение программы с сообщением об ошибке, содержащим номер строки и имя файла возникновения ошибки.

Пример:

// Класс CMyAge наследуется от Cobject

class CMyAge : public Cobject

{ DECLARE_SERIAL (CMyAge)

private:

int m_years;

public:

CMyAge() { m_years = 0; }

CMyAge (int age) { m_years = age;}

CMyAge (const CMyAge& a) { m_years = a.m years; }

void Serialize (CArchiveA ar);

void AssertValidO const;

const CMyAge& operator= (const CMyAge& a)

{ m_years = a.m_years; return *this; }

BOOL operator==(CMyAge a)

{ return m years == a.m years; }

#ifdef _DEBUG

void Dump (CDumpContext& dc) const

{ CObject::Dump (dc); dc « m_years; }

#endif

};

// Применение метода CObject: Assert Valid

void CMyAge: :AssertValid() const

{ CObject::AssertValid(); ASSERT (m_years > 0); ASSERT (m_years < 105;}

virtual void CObject::Dump (CDumpContext& dc) const;

Этот метод заносит содержание данного объекта в объект, указываемый параметром dc.

Отметим, что при создании собственного класса следует переопределить метод Dump. Как правило, при этом первоначально указывается вызов метода Dump из базового класса, а затем заносится содержание членов производного класса. CObject::Dump печатает имя класса в том случае, если при реализации класса был использован макрос IMPLEMENT_DYNAMIC или IMPLEMENT_SERIAL.

Пример:

void CMyAge: :Dump (CDumpContext &dc) const

{ CObject::Dump (dc); dc « "Age = " « m_years; }

Класс CDumpContext не имеет базового класса. Он поддерживает поток вывода диагностики в удобной для чтения форме - в виде текста.

Также для вывода диагностики можно использовать объект afxDump.

Класс CDumpContext имеет свой перегружаемый оператор вставки («), поэтому для изменения формата данных, заносимых в дамп, следует переопределить метод CObject::Dump.

В большинстве классов библиотеки MFC метод Dump переопределен. Для некоторых классов, не имеющих CObject в качестве базового класса, таких, как CString, CTime и др., реализован свой перегружаемый оператор вставки класса CDumpContext.

Отметим, что перед созданием объекта CDumpContext следует создать объект CFile, предназначаемый для дампа.

BOOL CObject: :IsSerializable () const;

Член структуры CRuntimeClass mJpszClassName содержит имя класса (строка, ограниченная 0-символом; тип LPCSTR).

Пример:

CMyAge a(21);

CRuntimeClass* prt = a.GetRuntimeClass();

ASSERT (strcmp (prt->m lpszClassName, "CMyAge") == 0);

BOOL CObject::IsKindOf (const CRuntimeClass* pClass) const;

Метод возвращает ненулевое значение, если данный объект соответствует классу, указанному структурой CRuntimeClass.

Пример:

CMyAge a(21);

// Класс должен использовать макрос IMPLEMENT_DYNAMIC

// или IMPLEMENT SERIAL

ASSERT (a.IsKindOf (RUNTIME_CLASS (CMyAge))) ;

// Проверка на принадлежность базовому классу:

ASSERT (a.IsKindOf (RUNTIME_CLASS (CObject))) ;

Соседние файлы в папке VC++Баженова