Шаг 223 - AssertValid

virtual void AssertValid( ) const;
Отладочная функция. С помощью нее проверяют объект на допустимость значения. Если значения в объекте не допустимые, то вызывается ошибка с номером, в которой указываются номер строки и имя файла, т.е. место совершения ошибки. Для того, чтобы проверить наш объект нам нужно эту функцию перегрузить, написав свой проверочный код. И при этом обычно вызвают одноименный метод базового класса.
#include "afxwin.h"
#include "iostream.h"

class CMyObject : public CObject
{
public:
    void AssertValid() const;
protected:
    DECLARE_DYNCREATE(CMyObject)
private:
	int x;
	int y;
};

IMPLEMENT_DYNCREATE(CMyObject,CObject);

void CMyObject::AssertValid() const
{
	CObject::AssertValid();
	ASSERT(x==100);
	ASSERT(y==100);
}

class CAlternativeObject : public CObject
{
protected:
 DECLARE_SERIAL(CAlternativeObject);	
};

IMPLEMENT_SERIAL(CAlternativeObject,CObject,1);


void main()
{
CMyObject cm;
}

В данном примере мы создали функцию, которая будет проверять, чтобы данные в классе x и y были равны 100. Так как функция const, то изменить значения внутри нее нельзя. Можно только проверить. При этом как вы заметили я не вызывал исключения, а вызывая макрос ASSERT для проверки значений и это правильно. Самому вызывать исключения внутри этой функции нельзя. Проверять можно не только значения, но и указатели, например, если в классе есть ссылка на другие объекты, что эти ссылки действительны. Давайте вызовем ее сразу после создания объекта:

void main()
{
	CMyObject cm;
	cm.AssertValid();  
}
AssertValid - это отладочная функция и применять вы ее можете только в версии DEBUG, во всех остальных она просто изчезнет. Поэтому грамотно проверять конфигурацию компиляции и использовать эту функцию в режиме отладки. Вот так.
......
class CMyObject : public CObject
{
public:
	#ifdef _DEBUG
    void AssertValid() const;
	#endif
 
protected:
    DECLARE_DYNCREATE(CMyObject)
private:
	int x;
	int y;
};

IMPLEMENT_DYNCREATE(CMyObject,CObject);

#ifdef _DEBUG
void CMyObject::AssertValid() const
{
	CObject::AssertValid();
	ASSERT(x==100);
	ASSERT(y==100);
}
#endif

......
void main()
{
	CMyObject cm;
#ifdef _DEBUG
	cm.AssertValid();  
#endif
}

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 18.08.2000