Clase CObject

La clase base principal para la biblioteca de MFC (Microsoft Foundation Class).

Sintaxis

class AFX_NOVTABLE CObject

Miembros

Constructores protegidos

Nombre Descripción
CObject::CObject Constructor predeterminado.

Métodos públicos

Nombre Descripción
CObject::AssertValid Valida la integridad de este objeto.
CObject::Dump Genera un volcado de diagnóstico de este objeto.
CObject::GetRuntimeClass Devuelve la estructura CRuntimeClass correspondiente a la clase de este objeto.
CObject::IsKindOf Comprueba la relación de este objeto con una clase determinada.
CObject::IsSerializable Prueba para ver si este objeto se puede serializar.
CObject::Serialize Carga o almacena un objeto desde o hacia un archivo.

Operadores públicos

Nombre Descripción
CObject::operator delete Operador delete especial.
CObject::operator new Operador new especial.

Comentarios

Actúa como raíz no solo para clases de biblioteca como CFile y CObList, sino también para las clases que se escriben. CObject proporciona servicios básicos, incluyendo

  • Compatibilidad con la serialización
  • Información de clase en tiempo de ejecución
  • Salida de diagnóstico de objetos
  • Compatibilidad con clases de colección

CObject no admite la herencia múltiple. Las clases derivadas solo pueden tener una clase base CObject y esa CObject debe ser la que está más a la izquierda en la jerarquía. Sin embargo, está permitido tener estructuras y clases no derivadas de CObject en ramas de herencia múltiple de la derecha.

Si usa algunas de las macros opcionales en las declaraciones y la implementación de la clase, se dará cuenta de las principales ventajas de la derivación deCObject.

Las macros de primer nivel, DECLARE_DYNAMIC y IMPLEMENT_DYNAMIC, permiten el acceso en tiempo de ejecución al nombre de clase y su posición en la jerarquía. Esto, a su vez, permite un volcado de diagnóstico significativo.

Las macros de segundo nivel, DECLARE_SERIAL y IMPLEMENT_SERIAL, incluyen toda la funcionalidad de las macros de primer nivel y permiten que un objeto se "serialice" hacia y desde un "archivo".

Para obtener más información sobre cómo derivar clases de Microsoft Foundation y clases de C++ en general y usar CObject, vea Uso de CObject and Serialización.

Jerarquía de herencia

CObject

Requisitos

Encabezadoafx.h:

CObject::AssertValid

Valida la integridad de este objeto.

virtual void AssertValid() const;

Comentarios

AssertValid realiza una comprobación de validez en este objeto comprobando su estado interno. En la versión de depuración de la biblioteca, AssertValid puede afirmar y, a continuación, finalizar el programa con un mensaje que muestra el número de línea y el nombre de archivo en los que se ha produce un error en la aserción.

Al escribir su propia clase, debe invalidar la función AssertValid para proporcionar servicios de diagnóstico para usted y otros usuarios de la clase. La función AssertValid invalidada normalmente llama a la función AssertValid de su clase base antes de comprobar los miembros de datos únicos de la clase derivada.

Dado que AssertValid es una función const, no se permite cambiar el estado del objeto durante la prueba. Las propias funciones AssertValid derivadas de clase no deberían producir excepciones, sino que deben afirmar si detectan datos de objeto no válidos.

La definición de "validez" depende de la clase del objeto. Como regla general, la función debería realizar una "comprobación superficial". Es decir, si un objeto contiene punteros a otros objetos, debería comprobar si los punteros no son NULL, pero no debería realizar pruebas de validez en los objetos a los que hacen referencia los punteros.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en todos los ejemplos de CObject.

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

Para obtener otro ejemplo, vea AfxDoForAllObjects.

CObject::CObject

Estas funciones son los constructores CObject estándar.

CObject();
CObject(const CObject& objectSrc);

Parámetros

objectSrc
Una referencia a otro CObject

Comentarios

El constructor de la clase derivada llama automáticamente a la versión predeterminada.

Si la clase es serializable (incorpora la macro IMPLEMENT_SERIAL), debe tener un constructor predeterminado (un constructor sin argumentos) en la declaración de clase. Si no necesita un constructor predeterminado, declare un constructor privado o protegido "vacío". Para obtener más información, consulte Uso de CObject.

El constructor estándar C++ de copia de clase predeterminado realiza una copia miembro a miembro. La presencia del constructor de copia CObject privado garantiza un mensaje de error del compilador si el constructor de copia de la clase es necesario pero no está disponible. Proporcione un constructor de copia si la clase requiere esta funcionalidad.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en los ejemplos de CObject.

// Create a CAge object using the default constructor.
CAge age1;

// Create a CAge object using the copy constructor.
CAge age2(age1);

CObject::Dump

Vuelca los contenidos del objeto en un objeto CDumpContext.

virtual void Dump(CDumpContext& dc) const;

Parámetros

dc
El contexto de volcado de diagnóstico para el volcado, normalmente afxDump.

Comentarios

Al escribir su propia clase, debe invalidar la función Dump para proporcionar servicios de diagnóstico para usted y otros usuarios de la clase. La función Dump invalidada normalmente llama a la función Dump de su clase base antes de imprimir miembros de datos únicos para la clase derivada. CObject::Dump imprime el nombre de clase si la clase usa las macro IMPLEMENT_DYNAMIC o IMPLEMENT_SERIAL.

Nota:

La función Dump no debería imprimir un carácter de nueva línea al final de su salida.

Las llamadas Dump tienen sentido solo en la versión de depuración de la biblioteca MFC (Microsoft Foundation Class). Debe incluir entre corchetes llamadas, declaraciones de función e implementaciones de función instrucciones #ifdef _DEBUG, #endif para la compilación condicional.

Puesto que Dump es una función const, no se permite cambiar el estado del objeto durante el volcado.

El operador de inserción de CDumpContext (<<) llama a Dump cuando se inserta un puntero CObject.

Dump solo permite el volcado "acíclico" de objetos. Puede volcar una lista de objetos, por ejemplo, pero si uno de los objetos es la propia lista, finalmente desbordará la pila.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en todos los ejemplos de CObject.

void CAge::Dump(CDumpContext& dc) const
{
   CObject::Dump(dc);
   dc << _T("Age = ") << m_years;
}

CObject::GetRuntimeClass

Devuelve la estructura CRuntimeClass correspondiente a la clase de este objeto.

virtual CRuntimeClass* GetRuntimeClass() const;

Valor devuelto

Un puntero a la estructura CRuntimeClass correspondiente a la clase de este objeto; nunca NULL.

Comentarios

Hay una estructura CRuntimeClass para cada clase derivada de CObject. Los miembros de la estructura son los siguientes:

  • LPCSTR m_lpszClassName Una cadena terminada en un valor NULL que contiene el nombre de clase ASCII.

  • int m_nObjectSize El tamaño del objeto en bytes. Si el objeto tiene miembros de datos que apuntan a la memoria asignada, no se incluye el tamaño de esa memoria.

  • UINT m_wSchema El número de esquema (-1 para clases no serializables). Consulte la macro IMPLEMENT_SERIAL para obtener una descripción del número de esquema.

  • CObject* (PASCAL* m_pfnCreateObject)() Un puntero de función al constructor predeterminado que crea un objeto de la clase (válido solo si la clase admite la creación dinámica; de lo contrario, devuelve NULL).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() Si la aplicación está vinculada dinámicamente a la versión AFXDLL de MFC, un puntero a una función que devuelve la estructura CRuntimeClass de la clase base.

  • CRuntimeClass* m_pBaseClass Si la aplicación está vinculada estáticamente a MFC, un puntero a la estructura CRuntimeClass de la clase base.

Esta función requiere el uso de las macros IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATE o IMPLEMENT_SERIAL en la implementación de clase. De lo contrario, se obtienen resultados incorrectos.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en todos los ejemplos de CObject.

CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

CObject::IsKindOf

Comprueba la relación de este objeto con una clase determinada.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

Parámetros

pClass
Un puntero a una estructura CRuntimeClass asociada a la clase derivada de CObject.

Valor devuelto

Distinto de cero si el objeto corresponde a la clase; de lo contrario, 0.

Comentarios

Esta función prueba pClass para ver si (1) es un objeto de la clase especificada o (2) es un objeto de una clase derivada de la clase especificada. Esta función solo funciona para las clases declaradas con las macros DECLARE_DYNAMIC, DECLARE_DYNCREATE o DECLARE_SERIAL.

No use esta función ampliamente porque se desafía la característica de polimorfismo de C++. En su lugar, use funciones virtuales.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en todos los ejemplos de 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

Compruebe si este objeto es apto para la serialización.

BOOL IsSerializable() const;

Valor devuelto

Distinto de cero si este objeto se puede serializar; de lo contrario, 0.

Comentarios

Para que una clase sea serializable, su declaración debe contener la macro DECLARE_SERIAL y la implementación debe contener la macro IMPLEMENT_SERIAL.

Nota:

No invalide esta función.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en todos los ejemplos de CObject.

CAge a(21);
ASSERT(a.IsSerializable());

CObject::operator delete

Para la versión de lanzamiento de la biblioteca, el operador delete libera la memoria asignada por el operador 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);

Comentarios

En la versión de depuración, el operador delete participa en un esquema de supervisión de asignación diseñado para detectar fugas de memoria.

Si usa la línea de código

#define new DEBUG_NEW

antes de cualquiera de las implementaciones en un archivo .CPP, entonces se usará la tercera versión de delete, almacenando el nombre de archivo y el número de línea en el bloque asignado para informes posteriores. No tiene que preocuparse de proporcionar los parámetros adicionales; una macro se encarga de ello.

Aunque no use DEBUG_NEW en modo de depuración obtiene la detección de fugas, pero sin los informes de número de línea de archivo de origen descritos anteriormente.

Si invalida los operadores new y delete, renuncia a esta funcionalidad de diagnóstico.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en los ejemplos de 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

Para la versión de lanzamiento de la biblioteca, el operador new realiza una asignación de memoria óptima de forma similar a 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);

Comentarios

En la versión de depuración, el operador new participa en un esquema de supervisión de asignación diseñado para detectar fugas de memoria.

Si usa la línea de código

#define new DEBUG_NEW

antes de cualquiera de las implementaciones en un archivo .CPP, entonces se usará la segunda versión de new, almacenando el nombre de archivo y el número de línea en el bloque asignado para informes posteriores. No tiene que preocuparse de proporcionar los parámetros adicionales; una macro se encarga de ello.

Aunque no use DEBUG_NEW en modo de depuración obtiene la detección de fugas, pero sin los informes de número de línea de archivo de origen descritos anteriormente.

Nota:

Si invalida este operador, también debe invalidar delete. No use la función _new_handler de la biblioteca estándar.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en los ejemplos de 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

Lee o escribe este objeto de o en un archivo.

virtual void Serialize(CArchive& ar);

Parámetros

ar
Objeto CArchive que se va a serializar hacia o desde.

Comentarios

Invalide Serialize para cada clase que vaya a serializar. La función Serialize invalidada debe llamar primero a la función Serialize de su clase base.

También debe usar la macro DECLARE_SERIAL en la declaración de clase y debe usar la macro IMPLEMENT_SERIAL en la implementación.

Use CArchive::IsLoading o CArchive::IsStoring para determinar si el archivo se está cargando o almacenando.

Serialize es llamado por CArchive::ReadObject y CArchive::WriteObject. Estas funciones están asociadas al operador de inserción ( <<) y al operador de extracción ( >>) de CArchive.

Para obtener ejemplos de serialización, consulte el artículo Serialización de un objeto.

Ejemplo

Consulte CObList::CObList para obtener una lista de la clase CAge que se usa en todos los ejemplos de CObject.

void CAge::Serialize(CArchive& ar)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())
      ar << m_years;
   else
      ar >> m_years;
}

Consulte también

Gráfico de jerarquías