Condividi tramite


ASSERT_VALID e CObject::AssertValid di MFC

Aggiornamento: novembre 2007

Le informazioni contenute in questo argomento sono valide per:

Edition

Visual Basic

C#

C++

Web Developer

Express

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Standard

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Pro e Team

Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Legenda tabella:

Argomento applicabile

Applicabile

Argomento non applicabile

Non applicabile

Argomento valido ma comando nascosto per impostazione predefinita

Comando o comandi nascosti per impostazione predefinita.

Il metodo CObject::AssertValid consente di eseguire controlli di runtime dello stato interno di un oggetto. Anche se non viene richiesto l'override di AssertValid, quando la classe viene derivata da CObject, questa operazione consente di migliorarne l'affidabilità. AssertValid deve eseguire asserzioni su tutte le variabili membro dell'oggetto per verificare che contengano valori validi. È ad esempio opportuno controllare che le variabili membro del puntatore non abbiano valore NULL.

L'esempio che segue illustra come dichiarare una funzione AssertValid:

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

Quando si esegue l'override di AssertValid, chiamare la versione della classe base di AssertValid prima di eseguire i controlli. Utilizzare quindi la macro ASSERT per controllare i membri che appartengono unicamente alla classe derivata, come illustrato di seguito:

#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 una o più delle variabili membro memorizza oggetti, è possibile utilizzare la macro ASSERT_VALID per verificarne la validità interna (se le rispettive classi operano l'override di AssertValid).

Si consideri ad esempio una classe CMyData, che memorizza un CObList in una delle proprie variabili membro. La variabile CObList, m_DataList, memorizza un insieme di oggetti CPerson. Una dichiarazione abbreviata di CMyData sarà analoga alla seguente:

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

L'override di AssertValid in CMyData sarà analogo al seguente:

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

CMyData utilizza il meccanismo di AssertValid per verificare la validità degli oggetti memorizzati nel proprio membro dati. La funzione AssertValid di CMyData che esegue l'override richiama la macro ASSERT_VALID per la propria variabile membro m_pDataList.

La verifica della validità non termina a questo livello poiché la classe CObList esegue a sua volta l'override di AssertValid. Questo override esegue un'ulteriore verifica della validità sullo stato interno della lista. Una verifica di validità condotta su un oggetto CMyData conduce quindi a ulteriori verifiche di validità per gli stati interni dell'oggetto CObList memorizzato.

Con poche operazioni aggiuntive è possibile aggiungere verifiche di validità anche per gli oggetti CPerson memorizzati nell'elenco. È possibile derivare una classe CPersonList da CObList ed eseguire l'override di AssertValid. Nell'override si chiama CObject::AssertValid e poi si itera l'operazione sulla lista, chiamando AssertValid su ciascun oggetto CPerson memorizzato. La classe CPerson illustrata all'inizio di questo argomento esegue già l'override di AssertValid.

Si tratta di un meccanismo potente quando si operano generazioni per il debug. Quando si effettuano in seguito generazioni per il rilascio, il meccanismo viene disattivato automaticamente.

Limitazioni di AssertValid

È opportuno che gli utenti di una funzione AssertValid di una determinata classe siano a conoscenza delle limitazioni di tale funzione. La generazione di un'asserzione conferma che l'oggetto non è corretto e l'esecuzione verrà interrotta. La mancanza di asserzioni, tuttavia, indica solo che non è stato rilevato alcun problema e non garantisce la validità dell'oggetto.

Vedere anche

Concetti

Asserzioni MFC