Поделиться через


Класс 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_DYNAMICIMPLEMENT_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_DYNAMICDECLARE_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;
}

См. также

Диаграмма иерархии