다음을 통해 공유


MFC ASSERT_VALID 및 CObject::AssertValid

이 항목은 다음 언어에 적용됩니다.

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

Pro, Premium 및 Ultimate

항목이 적용되지 않음 항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

CObject::AssertValid 메서드는 런타임에 개체의 내부 상태를 검사합니다. CObject에서 클래스를 파생할 때 AssertValid를 반드시 재정의해야 하는 것은 아니지만, 이렇게 하면 클래스의 안정성이 강화됩니다. AssertValid는 개체의 모든 멤버 변수를 어설션하여 유효한 값이 들어 있는지 확인해야 합니다. 예를 들어, 포인터 멤버 변수가 NULL이 아닌지 확인합니다.

다음 예제에서는 AssertValid 함수를 선언하는 방법을 보여 줍니다.

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

AssertValid를 재정의할 때는 AssertValid의 기본 클래스 버전을 먼저 호출하고, 다음과 같이 ASSERT 매크로를 사용하여 파생된 클래스의 고유 멤버를 검사하십시오.

#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

개체를 저장하는 멤버 변수가 있고 해당 클래스가 AssertValid를 재정의하는 경우, ASSERT_VALID 매크로를 사용하여 내부 유효성을 테스트할 수 있습니다.

예를 들어, CMyData 클래스가 멤버 변수 중 하나에 CObList를 저장할 경우를 고려해 보십시오. CObList 변수 m_DataList는 CPerson 개체 모음을 저장합니다. CMyData의 약식 선언은 다음과 같습니다.

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

CMyData에서 AssertValid는 다음과 같이 재정의합니다.

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

CMyData는 AssertValid 메커니즘을 사용하여 해당 데이터 멤버에 저장된 개체의 유효성을 테스트합니다. CMyData의 재정의된 AssertValid에서 자체 m_pDataList 멤버 변수에 대해 ASSERT_VALID 매크로를 호출합니다.

클래스 CObListAssertValid를 재정의하기 때문에 이 수준에서는 유효성 테스트가 중지되지 않습니다. 이렇게 재정의하면 목록의 내부 상태 유효성이 추가로 테스트됩니다. 따라서 CMyData 개체의 유효성 테스트가 끝나면 저장된 CObList 목록 개체의 내부 상태 유효성이 추가로 테스트됩니다.

목록에 저장된 CPerson 개체에 대한 유효성 테스트도 추가할 수 있습니다. CObList에서 CPersonList 클래스를 파생시키고 AssertValid를 재정의할 수 있습니다. 재정의할 때 CObject::AssertValid를 호출한 다음 목록을 반복하여 목록에 저장된 각 CPerson개체의 AssertValid를 호출합니다. 이 항목의 시작 부분에 나오는 CPerson 클래스가 이미 AssertValid를 재정의합니다.

이것은 디버깅을 빌드할 때 효과적인 메커니즘입니다. 계속해서 릴리스를 빌드할 경우 이 메커니즘은 자동으로 해제됩니다.

AssertValid 한계

특정 클래스의 AssertValid 함수를 사용하려면 이 함수의 제한 사항을 고려해야 합니다. 어설션이 트리거되면 개체가 잘못된 것이므로 실행이 중지됩니다. 그러나 어설션 부족은 발견된 문제가 없다는 것을 나타낼 뿐, 개체가 양호하다고 보장하는 것은 아닙니다.

참고 항목

개념

MFC 어설션