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
Encabezado: afx.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 macroIMPLEMENT_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, devuelveNULL
).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 estructuraCRuntimeClass
de la clase base.CRuntimeClass* m_pBaseClass
Si la aplicación está vinculada estáticamente a MFC, un puntero a la estructuraCRuntimeClass
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;
}