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 }