Partager via


MFC ASSERT_VALID et CObject::AssertValid

Cette rubrique s'applique à :

Édition

Visual Basic

C#

F#

C++

Web Developer

Express

La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Pro, Premium et Ultimate

La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

La méthode CObject::AssertValid fournit des contrôles à l'exécution de l'état interne d'un objet. Bien que vous ne soyez pas tenus de substituer AssertValid lorsque vous dérivez votre classe de CObject, vous pouvez rendre votre classe plus fiable en effectuant cette opération. AssertValid doit exécuter des assertions sur toutes les variables de membres de l'objet pour vérifier qu'ils contiennent des valeurs valides. Par exemple, elle vérifie en principe que les variables de membre de pointeur ne sont pas NULL.

L'exemple suivant montre comment déclarer une fonction AssertValid :

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

Lorsque vous substituez AssertValid, appelez la version de AssertValid correspondant à la classe de base avant d'effectuer vos propres vérifications. Utilisez ensuite la macro ASSERT pour vérifier les membres propres à votre classe dérivée, comme indiqué ci-après :

#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 l'une de vos variables de membre stocke des objets, vous pouvez utiliser la macro ASSERT_VALID pour tester leur validité interne (si leurs classes substituent AssertValid).

Prenez, par exemple, une classe CMyData, qui stocke un CObList dans l'une de ses variables de membre. La variable CObList, m_DataList, stocke une collection d'objets CPerson. Une déclaration abrégée de CMyData a l'aspect suivant :

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 ...
};

La substitution de AssertValid dans CMyData a l'aspect suivant :

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

CMyData utilise le mécanisme AssertValid pour tester la validité des objets stockés dans ses données membres. L'AssertValid de substitution dans CMyData appelle la macro ASSERT_VALID pour sa propre variable de membre m_pDataList.

Les tests de validité ne s'arrêtent pas à ce niveau, car la classe CObList se substitue également à AssertValid. Cette substitution réalise des tests de validité supplémentaires sur l'état interne de la liste. Ainsi, un test de validité sur un objet CMyData conduit à des tests de validité supplémentaires pour contrôler les états internes de l'objet liste CObList stocké.

Moyennant un peu plus de travail, vous pourriez également ajouter des tests de validité pour les objets CPerson stockés dans la liste. Vous pourriez dériver une classe CPersonList de CObList et substituer AssertValid. Dans la substitution, vous appelleriez CObject::AssertValid, puis itéreriez au sein de la liste, en appelant AssertValid sur chaque objet CPerson stocké dans la liste. La classe CPerson affichée au début de cette rubrique substitue la fonction AssertValid.

Il s'agit d'un mécanisme puissant lorsque vous générez pour le débogage. Lorsque, par la suite, vous déboguez pour la diffusion, le mécanisme est automatiquement désactivé.

Limites de la fonction AssertValid

Les utilisateurs d'une fonction AssertValid d'une classe donnée doivent être conscients des limites de cette fonction. Une assertion déclenchée indique que l'objet est manifestement défectueux et que l'exécution s'arrêtera. Toutefois, une absence d'assertion indique seulement qu'aucun problème n'a été trouvé, sans garantir pour autant la validité de l'objet.

Voir aussi

Concepts

Assertions MFC