Compartir a través de


ASSERT_VALID y CObject::AssertValid de MFC

Actualización: noviembre 2007

Este tema es aplicable a:

Edición

Visual Basic

C#

C++

Web Developer

Express

Sólo para código nativo

Estándar

Sólo para código nativo

Pro y Team

Sólo para código nativo

Leyenda de la tabla:

Se aplica

No procede

Comando o comandos ocultos de manera predeterminada.

El método CObject::AssertValid proporciona comprobaciones en tiempo de ejecución del estado interno de un objeto . Aunque no es necesario invalidar AssertValid cuando deriva la clase de CObject, si hace esto, la clase será de mayor confianza. AssertValid debe realizar las aserciones en todas las variables miembro del objeto para comprobar que contienen valores válidos. Por ejemplo, debería comprobar que las variables miembro no sean NULL.

En el ejemplo siguiente, se muestra cómo declarar una función AssertValid:

class CPerson : public CObject
{
protected:
    CString m_strName;
    float   m_salary;
public:
#ifdef _DEBUG
    // Override
    virtual void AssertValid() const;
#endif
    // ...
};

Cuando invalide AssertValid, llame a la versión de la clase base de AssertValid antes de ejecutar sus propias comprobaciones. Después, use la macro ASSERT para comprobar los miembros únicos de la clase derivada, como se muestra a continuación:

#ifdef _DEBUG
void CPerson::AssertValid() const
{
    // Call inherited AssertValid first.
    CObject::AssertValid();

    // Check CPerson members...
    // Must have a name.
    ASSERT( !m_strName.IsEmpty());
    // Must have an income.
    ASSERT( m_salary > 0 );
}
#endif

Si cualquiera de las variables miembro almacenan objetos, se puede utilizar la macro ASSERT_VALID para probar su validez interna (si sus clases reemplazan la función AssertValid).

Por ejemplo, considere una clase CMyData, la cual almacena un objeto CObList en una de sus variables miembro. La variable CObList, m_DataList, almacena una colección de objetos CPerson. Una declaración abreviada de CMyData tiene el siguiente aspecto:

class CMyData : public CObject
{
    // Constructor and other members ...
    protected:
        CObList* m_pDataList;
    // Other declarations ...
    public:
#ifdef _DEBUG
        // Override:
        virtual void AssertValid( ) const;
#endif
    // And so on ...
};

El sustituto de AssertValid en CMyData es:

#ifdef _DEBUG
void CMyData::AssertValid( ) const
{
    // Call inherited AssertValid.
    CObject::AssertValid( );
    // Check validity of CMyData members.
    ASSERT_VALID( m_pDataList );
    // ...
}
#endif

CMyData utiliza el mecanismo AssertValid para probar la validez de los objetos almacenados en su miembro de datos. El sustituto AssertValid de CMyData invoca la macro ASSERT_VALID para su propia variable miembro m_pDataList.

Las pruebas de validez no se detienen en este nivel, ya que la clase CObList reemplaza también la función AssertValid. Esta sustitución ejecuta pruebas de validez adicionales sobre el estado interno de la lista. Así, una prueba de validez sobre un objeto CMyData conduce a pruebas de validez adicionales sobre los estados internos del objeto de lista CObList almacenado.

Con algo más de trabajo, se podrían también agregar pruebas de validez para los objetos CPerson almacenados en la lista. Se podría derivar una clase CPersonList de CObList y reemplazar AssertValid. En el método reemplazado, se llamaría a CObject::AssertValid y, a continuación, la lista se recorrería en iteración, llamando a AssertValid para cada objeto CPerson almacenado en la lista. La clase CPerson mostrada al principio de este tema ya reemplaza la función AssertValid.

Se trata de un mecanismo muy eficaz de las versiones de depuración. Cuando, posteriormente, se generan versiones de lanzamiento, el mecanismo se desactiva automáticamente.

Limitaciones de AssertValid

Los usuarios de una función AssertValid de una clase dada deberían tener en cuenta las limitaciones de esta función. Si se desencadena una aserción, el objeto es definitivamente defectuoso y la ejecución se detendrá. Sin embargo, la falta de aserción sólo indica que no se encontró ningún problema, pero no garantiza que el objeto sea correcto.

Vea también

Conceptos

Aserciones de MFC