|
Программирование >> Дополнительные возможности наследования
145: #ifdef SHOW.INVARIANTS 146: cout Invariants Tested ; 147: #endif 148: return ( (itsLen && ItsString) 149: (litsLen && litsString) ); 150: } 151: class Animal 152: { 153: public: 154: AnimaK ): itsAged ), itsName( John Q. Animal ) 155: { ASSERTdnvariantsO);} 156: Animal(int, const String&); 157: AnimalOi } 158: int GetAgeO { ASSERTdnvariantsO); return itsAge; } 159: void SetAgednt Age) 160: { 161; ASSERT(Invariants()); 162: itsAge = Age; 163: ASSERT(Invariants()); 164: } 165; Strings GetNameO 166: { 167; ASSERT(Invariants()); 168: return itsName; 169; } 170; void SetName(const String& name) 171; { 172: ASSERT(Invariants()); 173; itsName = name; 174: ASSERT(Invariants()); 175; } 176: bool InvariantsO; 177; private: 178; int ItsAge; 179: String itsName; 180: } ; 181; 182: Animal;:Animal(int age, const String& name); 183: itsAge(age), 184; itsName(name) 185: { 186: ASSERTdnvariantsO); 187: } 188; 189: bool Animal;;InvariantsO 190: { 191; Sifdef SHOW INVARIANTS 192; cout Invariants Tested ; 193; #endif 194: return (itsAge > 0 && itsName. GetLenO); 195 196 197 198 199 200 201 202 203 204 205 206 int main() { Animal sparky(5, Sparky ); cout << \ n sparky.GetNameO.GetStringO is cout << sparky. GetAgeO years old. ; sparky.SetAge(8); cout \ n sparky.GetNameO.GetStringO << is cout << sparky.GetAge() years old. ; return 0; String OK String OK String OK String OK String OK String OK String OK String OK String OK Animal OK String OK Animal OK Sparky is Animal OK 5 years old. Animal OK Animal 01 Animal OK Sparky is Animal OK 8 years old. String 01 ring OK В строках 9-15 определяется макрос assertO. Если лексема DEBUG определена и макрос assertO возвратит в результате операции сравнения значение FALSE, будет выведено сообщение об ощибке. В строке 39 объявляется функция-член InvariantsO класса String, а ее определение занимает строки 143-150. Конструктор объявляется в строках 49-55, а в строке 54, после того как объект полностью построен, вызывается функция-член InvariantsO, чтобы подтвердить правомочность этой конструкции. Этот алгоритм повторен для других конструкторов, а для деструктора функция-член InvariantsO вызывается только перед тем, как удалить объект. Остальные методы класса вызывают функцию InvariantsO перед выполнением любого действия, а затем еще раз перед возвратом из функции. В этом проявляется отличие функций-членов от конструкторов и деструкторов: функции-члены всегда работают с реальными объектами и должны оставить их таковыми по заверщению выполнения функции. В строке 176 класс Animal объявляет собственный метод InvariantsO, выполняемый в строках 189-195. Обратите внимание на строки 155, 158, 161 и 163: подставляемые функции также могут вызывать метод InvariantsO. Печать промежуточных значении Не исключено, что в дополнение к возможности с помощью макроса assertO убедиться в истинности некоторого тестируемого выражения вы захотите вывести на экран текущие значения указателей, переменных и строк. Это может быть полезно для проверки ващих предположений насчет некоторых аспектов работы программы, а также при поиске ощибок в циклах. Реализация этой идеи показана в листинге 21.6. Листинг 21.G. Вывод значений в рвжимв отладки Листинг 21.6. Вывод значений в режиме отладки ftinclude <iostream.h> #define DEBUG
i: 1 1: 2 i: 3 i: 4 y: 73898 Hi, ; Hi. px: 0x2100 px: 5 - Макрос PRINT(x) (строки 5-10) реализует вывод текущего значения пере- данного параметра. Обратите внимание, что сначала объекту cout передается сам параметр, взятый в кавычки, т.е., если вы передадите параметр х, объект cout примет х . Затем объект cout принимает заключенную в кавычки строку :\ t , которая обеспечивает печать двоеточия и табуляции. После этого объект cout принимает значение параметра (х), а объект endl выполняет переход на новую строку и очищает буфер. Обратите внимание, что у вас вместо значения 0x2100 может быть выведено другое число.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |