ASSERT_VALID do MFC e CObject::AssertValid

This topic applies to:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Native only

O tópico não é aplicável

Pro, Premium e Ultimate

O tópico não é aplicável O tópico não é aplicável O tópico não é aplicável

Native only

O tópico não é aplicável

O CObject::AssertValid método fornece tempo de execução verifica o estado interno de um objeto. Embora você não precisa substituir AssertValid Quando você derivar de sua classe de CObject, você pode tornar sua classe mais confiável fazendo isso. AssertValiddeve realizar asserções em variáveis de membro de todos os do objeto para verificar se eles contêm os valores válidos. Por exemplo, ele deve verificar as variáveis de membro de ponteiro não forem nulas.

O exemplo a seguir mostra como declarar um AssertValid função:

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

Quando você substituir AssertValid, chame a versão da classe base de AssertValid antes de executar suas próprias verificações. Em seguida, use a macro ASSERT para verificar os membros exclusivos para sua classe derivada, conforme mostrado aqui:

#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

Se qualquer uma das suas variáveis de membro armazenar objetos, você pode usar o ASSERT_VALID macro para testar sua validade interna (se suas classes substituem AssertValid).

Por exemplo, considere uma classe CMyData, que armazena um CObList em uma das suas variáveis de membro. O CObList variável, m_DataList, que armazena uma coleção de CPerson objetos. Uma declaração abreviada do CMyData tem esta aparência:

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

O AssertValid Substituir em CMyData tem esta aparência:

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

CMyDatausa a AssertValid mecanismo para testar a validade dos objetos armazenados no seu membro de dados. A substituição de AssertValid de CMyData chama o ASSERT_VALID macro para sua própria variável de membro m_pDataList.

Teste de validade não parar neste nível porque a classe CObList substitui AssertValid muito. Essa substituição executa o estado interno da lista de teste de validade adicional. Assim, uma validade testar em um CMyData objeto leva a testes de validade adicionais para os estados internos da the stored CObList lista de objeto.

Com alguns mais trabalho, você poderia adicionar os testes de validade para o CPerson objetos armazenados na lista também. Você pode derivar uma classe CPersonList de CObList e substituir AssertValid. A substituição, você chamaria CObject::AssertValid e, em seguida, percorrer a lista, chamada AssertValid em cada CPerson objeto armazenado na lista. O CPerson classe mostrada no início deste tópico já substitui AssertValid.

Este é um poderoso mecanismo quando você cria para depuração. Quando você constrói subseqüentemente release, o mecanismo é desligado automaticamente.

Limitações do AssertValid

Os usuários de um AssertValid a função de uma determinada classe deve perceber das limitações de função. Uma declaração disparada indica que o objeto é definitivamente ruim e interromperá a execução. No entanto, a falta de declaração indica somente que foi encontrado nenhum problema, mas o objeto não é garantido em boas condições.

Consulte também

Conceitos

Declarações de MFC