Программирование >>  Дополнительные возможности наследования 

1 ... 221 222 223 [ 224 ] 225 226 227 ... 265


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



#ifndef DEBUG

Sdefine PfllNT(x)

Seise

#define PRINT(x) \

cout #x <<

\ f

Sendif

enum bool { FALSE

TRUE }

int main()

int X = 5;

long у = 738981

PRlNT(x):

for (int 1 = 0;

i < x;

PRlNT(i);

PRINT (y);

PRINK Hi. );

int *px = &x;

?!

PRINT(px);

PRINT (.px);

return 0;

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 может быть выведено другое число.



1 ... 221 222 223 [ 224 ] 225 226 227 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика