Класс CObject
Основной базовый класс для всех исключений библиотеки классов Microsoft Foundation.
Синтаксис
class AFX_NOVTABLE CObject
Участники
Защищенные конструкторы
Имя | Описание |
---|---|
CObject::CObject |
Конструктор по умолчанию. |
Открытые методы
Имя | Описание |
---|---|
CObject::AssertValid |
Проверяет целостность этого объекта. |
CObject::Dump |
Создает диагностический дамп этого объекта. |
CObject::GetRuntimeClass |
Возвращает структуру, соответствующую классу CRuntimeClass этого объекта. |
CObject::IsKindOf |
Проверяет связь этого объекта с заданным классом. |
CObject::IsSerializable |
Проверяет, можно ли сериализовать этот объект. |
CObject::Serialize |
Загружает или сохраняет объект из/в архив. |
Открытые операторы
Имя | Описание |
---|---|
CObject::operator delete |
Специальный delete оператор. |
CObject::operator new |
Специальный new оператор. |
Замечания
Он служит корнем не только для классов библиотеки, таких как CFile
и CObList
для классов, которые вы пишете. CObject
предоставляет базовые службы, включая
- Поддержка сериализации
- Сведения о классе во время выполнения
- Выходные данные диагностики объектов
- Совместимость с классами коллекции
CObject
не поддерживает несколько наследование. Производные классы могут иметь только один CObject
базовый класс, и он CObject
должен оставаться в иерархии. Однако допускается наличие структур и непроизводных CObject
классов в правой части ветвей множественного наследования.
При использовании некоторых необязательных макросов в реализации и объявлениях класса вы сможете воспользоваться основными преимуществами CObject
.
Макросы DECLARE_DYNAMIC
первого уровня и IMPLEMENT_DYNAMIC
разрешение доступа во время выполнения к имени класса и его позиции в иерархии. Это, в свою очередь, позволяет использовать значимый диагностический дампинг.
Макросы второго уровня и IMPLEMENT_SERIAL
включают все функциональные возможности макросов DECLARE_SERIAL
первого уровня, и они позволяют объекту сериализоваться в архив и из него.
Сведения о производных классах Microsoft Foundation и классах C++ в целом и использовании CObject
см. в разделе "Использование CObject и Сериализация".
Иерархия наследования
CObject
Требования
Заголовок: afx.h
CObject::AssertValid
Проверяет целостность этого объекта.
virtual void AssertValid() const;
Замечания
AssertValid
выполняет проверку допустимости этого объекта, проверяя его внутреннее состояние. В отладочной версии библиотеки AssertValid
может утверждаться, а затем завершить программу с сообщением, которое содержит номер строки и имя файла, в котором утверждение завершилось сбоем.
При написании собственного класса необходимо переопределить AssertValid
функцию, чтобы предоставить диагностические службы для себя и других пользователей класса. Переопределение AssertValid
обычно вызывает функцию базового класса перед проверкой AssertValid
элементов данных, уникальных для производного класса.
Так как AssertValid
это const
функция, вы не можете изменить состояние объекта во время теста. Собственные функции производного класса AssertValid
не должны вызывать исключения, а скорее должны утверждать, обнаруживают ли они недопустимые данные объекта.
Определение "допустимости" зависит от класса объекта. Как правило, функция должна выполнять "неглубокую проверку". То есть, если объект содержит указатели на другие объекты, он должен проверить, не NULL
являются ли указатели, но он не должен выполнять проверку действительности на объекты, на которые ссылается указатели.
Пример
См CObList::CObList
. описание класса, используемого CAge
во всех CObject
примерах.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Еще один пример см. в разделе AfxDoForAllObjects
.
CObject::CObject
Эти функции являются стандартными CObject
конструкторами.
CObject();
CObject(const CObject& objectSrc);
Параметры
objectSrc
Ссылка на другую CObject
Замечания
Версия по умолчанию автоматически вызывается конструктором производного класса.
Если класс сериализуется (он включает IMPLEMENT_SERIAL
макрос), в объявлении класса должен быть конструктор по умолчанию (конструктор без аргументов). Если конструктор по умолчанию не нужен, объявите закрытый или защищенный конструктор "пустой". Дополнительные сведения см. в разделе "Использование CObject
".
Стандартный конструктор копирования классов C++ по умолчанию выполняет копирование элементов по члену. Наличие конструктора частного CObject
копирования гарантирует сообщение об ошибке компилятора, если конструктор копирования класса необходим, но недоступен. Укажите конструктор копирования, если для вашего класса требуется эта возможность.
Пример
См CObList::CObList
. описание класса, CAge
используемого в CObject
примерах.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Дамп содержимого объекта CDumpContext
в объект.
virtual void Dump(CDumpContext& dc) const;
Параметры
dc
Обычно контекст диагностического afxDump
дампа для дампа.
Замечания
При написании собственного класса необходимо переопределить Dump
функцию, чтобы предоставить диагностические службы для себя и других пользователей класса. Переопределение Dump
обычно вызывает Dump
функцию базового класса перед печатью элементов данных, уникальных для производного класса. CObject::Dump
выводит имя класса, если класс использует IMPLEMENT_DYNAMIC
или IMPLEMENT_SERIAL
макрос.
Примечание.
Функция Dump
не должна печатать новый символ в конце выходных данных.
Dump
вызовы имеет смысл только в отладочной версии библиотеки классов Microsoft Foundation. Следует скобать вызовы, объявления функций и реализации функций с #ifdef _DEBUG
#endif
операторами для условной компиляции.
Так как Dump
это const
функция, вы не можете изменить состояние объекта во время дампа.
Оператор CDumpContext
вставки (<<) вызывается Dump
при CObject
вставке указателя.
Dump
разрешает только ациклическое дампа объектов. Например, можно дампать список объектов, но если один из объектов является самим списком, вы в конечном итоге переполняете стек.
Пример
См CObList::CObList
. описание класса, используемого CAge
во всех CObject
примерах.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
Возвращает структуру, соответствующую классу CRuntimeClass
этого объекта.
virtual CRuntimeClass* GetRuntimeClass() const;
Возвращаемое значение
Указатель на CRuntimeClass
структуру, соответствующую классу этого объекта; никогда.NULL
Замечания
Существует одна CRuntimeClass
структура для каждого CObject
производного класса. Члены структуры приведены следующим образом:
LPCSTR m_lpszClassName
Строка, завершающая значение NULL, содержащая имя класса ASCII.int m_nObjectSize
Размер объекта в байтах. Если объект содержит элементы данных, указывающие на выделенную память, размер этой памяти не включен.UINT m_wSchema
Номер схемы (-1 для несериализируемых классов). См.IMPLEMENT_SERIAL
макрос для описания номера схемы.CObject* (PASCAL* m_pfnCreateObject)()
Указатель функции на конструктор по умолчанию, который создает объект класса (допустимый только в том случае, если класс поддерживает динамическое создание; в противном случае возвращаетсяNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Если приложение динамически связано с версией AFXDLL MFC, указатель на функцию, возвращающуюCRuntimeClass
структуру базового класса.CRuntimeClass* m_pBaseClass
Если приложение статически связано с MFC, указатель наCRuntimeClass
структуру базового класса.
Эта функция требует использования IMPLEMENT_DYNAMIC
IMPLEMENT_DYNCREATE
макроса или IMPLEMENT_SERIAL
макроса в реализации класса. В противном случае вы получите неправильные результаты.
Пример
См CObList::CObList
. описание класса, используемого CAge
во всех CObject
примерах.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Проверяет связь этого объекта с заданным классом.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Параметры
pClass
Указатель на структуру, связанную с производным CObject
классомCRuntimeClass
.
Возвращаемое значение
Ненулевое значение, если объект соответствует классу; в противном случае — 0.
Замечания
Эта функция проверяет pClass
, является ли (1) объектом указанного класса или (2) является объектом класса, производным от указанного класса. Эта функция работает только для классов, объявленных с DECLARE_DYNAMIC
DECLARE_DYNCREATE
помощью макроса , или DECLARE_SERIAL
макроса.
Не используйте эту функцию широко, так как она побеждает функцию полиморфизма C++. Вместо этого используйте виртуальные функции.
Пример
См CObList::CObList
. описание класса, используемого CAge
во всех CObject
примерах.
CAge a(21); // Must use IMPLEMENT_DYNAMIC, IMPLEMENT _DYNCREATE, or
// IMPLEMENT_SERIAL
ASSERT(a.IsKindOf(RUNTIME_CLASS(CAge)));
ASSERT(a.IsKindOf(RUNTIME_CLASS(CObject)));
CObject::IsSerializable
Проверяет, подходит ли этот объект для сериализации.
BOOL IsSerializable() const;
Возвращаемое значение
Ненулевое значение, если этот объект можно сериализовать; в противном случае — 0.
Замечания
Чтобы класс был сериализуемым, его объявление должно содержать DECLARE_SERIAL
макрос, а реализация должна содержать IMPLEMENT_SERIAL
макрос.
Примечание.
Не переопределите эту функцию.
Пример
См CObList::CObList
. описание класса, используемого CAge
во всех CObject
примерах.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Для версии выпуска библиотеки оператор delete
освобождает память, выделенную оператором new
.
void PASCAL operator delete(void* p);
void PASCAL operator delete(
void* p,
void* pPlace);
void PASCAL operator delete(
void* p,
LPCSTR lpszFileName,
int nLine);
Замечания
В отладочной версии оператор delete
участвует в схеме мониторинга выделения, предназначенной для обнаружения утечки памяти.
Если вы используете строку кода
#define new DEBUG_NEW
перед любым из ваших реализаций в . Затем будет использоваться третья версия delete
файла CPP, сохраняющая имя файла и номер строки в выделенном блоке для последующего создания отчетов. Вам не нужно беспокоиться о предоставлении дополнительных параметров; Макрос заботится об этом за вас.
Даже если вы не используете DEBUG_NEW
в режиме отладки, вы по-прежнему получаете обнаружение утечки, но без отчета о строке исходного файла, описанном выше.
Если вы переопределяете операторы new
и delete
используете эту функцию диагностики.
Пример
См CObList::CObList
. описание класса, CAge
используемого в CObject
примерах.
void CAge::operator delete(void* p)
{
free(p);
}
void CAge::operator delete(void *p, LPCSTR lpszFileName, int nLine)
{
UNREFERENCED_PARAMETER(lpszFileName);
UNREFERENCED_PARAMETER(nLine);
free(p);
}
CObject::operator new
Для версии выпуска библиотеки оператор new
выполняет оптимальное выделение памяти аналогичным образом malloc
.
void* PASCAL operator new(size_t nSize);
void* PASCAL operator new(size_t, void* p);
void* PASCAL operator new(
size_t nSize,
LPCSTR lpszFileName,
int nLine);
Замечания
В отладочной версии оператор new
участвует в схеме мониторинга выделения, предназначенной для обнаружения утечки памяти.
Если вы используете строку кода
#define new DEBUG_NEW
перед любым из ваших реализаций в . Файл CPP, а затем будет использоваться вторая версия new
, сохраняя имя файла и номер строки в выделенном блоке для последующей отчетности. Вам не нужно беспокоиться о предоставлении дополнительных параметров; Макрос заботится об этом за вас.
Даже если вы не используете DEBUG_NEW
в режиме отладки, вы по-прежнему получаете обнаружение утечки, но без отчета о строке исходного файла, описанном выше.
Примечание.
При переопределении этого оператора необходимо также переопределить delete
. Не используйте стандартную функцию библиотеки _new_handler
.
Пример
См CObList::CObList
. описание класса, CAge
используемого в CObject
примерах.
void* CAge::operator new(size_t nSize)
{
return malloc(nSize);
}
void* CAge::operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
UNREFERENCED_PARAMETER(lpszFileName);
UNREFERENCED_PARAMETER(nLine);
return malloc(nSize);
}
CObject::Serialize
Считывает этот объект из архива или записывает в него.
virtual void Serialize(CArchive& ar);
Параметры
ar
CArchive
Объект для сериализации в или из.
Замечания
Переопределите Serialize
для каждого класса, который планируется сериализовать. Переопределенный Serialize
должен сначала вызвать Serialize
функцию своего базового класса.
Кроме того, необходимо использовать DECLARE_SERIAL
макрос в объявлении класса и использовать IMPLEMENT_SERIAL
макрос в реализации.
Используйте CArchive::IsLoading
или CArchive::IsStoring
определите, загружается ли архив или сохраняется.
Serialize
вызывается и CArchive::ReadObject
CArchive::WriteObject
. Эти функции связаны с оператором вставки (<<
) и оператором CArchive
извлечения (>>
).
Примеры сериализации см. в статье о сериализации объекта.
Пример
См CObList::CObList
. описание класса, используемого CAge
во всех CObject
примерах.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}