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

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


Уровни отладко

в больших и сложных проектах вам, возможно, понадобится больше рычагов управления для отлаживания профаммы, чем просто подключение и отключение режима отладки (путем определения лексемы DEBUG). Вы можете определять уровни отладки и выполнять тестирование для этих уровней, принимая решение о том, какие макрокоманды использовать, а какие - удалить.

Чтобы определить уровень отладки, достаточно после выражения sdefine DEBUG указать номер. Хотя число уровней может бьггь любым, обычная система должна иметь четыре уровня: HIGH (высокий), MEDIUM (средний), LOW (низкий) и NONE (никакой). В листинге 21.7 показано, как это можно сделать, на примере классов String и Animal из листинга 21.5.

Листинг 21.7. Уровни отладки

enum LEVEL { NONE, LOW, MEDIUM, HIGH } ; const int FALSE = 0; const int TRUE = 1; typedef int bool;

#define DEBUGLEVEL HIGH

Sinclude <iostream,h> ftinclude <string,h>

#if DEBUGLEVEL < LOW должен быть средний или высокий

#define ASSERT(x)

#else

#define ASSERT(x) \ if (! (x)) \ { \

cout ERROR!! Assert #x failed\ n ; \ cout on line LINE \ n ; \ oout in file FILE \ n ; \

#endif

#if DEBUGLEVEL < MEDIUM #define EVAL(x) #@lse

#defina EVAL(x) \

oout #x ;\ t x endl; #endif

#if DEBUGLEVEL < HIGH #define PRINT(x) #else

#define PRINT(x) \

cout X endl; #endif



36: 37:

38: class String

39: {

40: public:

41: конструкторы

42: StringO;

43: String(const char const):

44: String(const String &);

45: StringO;

47; char & operator[](int offset);

48; char operator[ ](int offset) const; 49:

50; String & operator= (const String &);

51; int GetLenOconst { return itsLen; }

52; const char GetStringO const

53; { return itsString; }

54: bool InvariantsO const;

56; private:

57: String (int); закрытый конструктор

58: char * itsString;

59: unsigned short itsLen;

60: } ;

62: стандартный конструктор создает строку нулевой длины

63: String;;String()

64: {

65: itsString = new char[1];

66: itsString[0] = \ 0 ;

67;, itsLen=0;

68; ASSERTdnvariantsO):

69: }

71: закрытый (вспомогательный) конструктор, используемый

72: методами класса только для создания новой строки

73: требуемого размера. Заполняется символом Null.

74; String: :String(int len)

75; {

76; itsString = new Ghar[len+1];

77; for (int 1=0; i<=len; i++)

78: itsString[i] = \ 0;

79; itsLen=len;

80; ASSERT(Invariants());

81; }

83: Преобразует массив символов к типу String

84: String:;String(const char * const cString)



85 86 87

itsLen = strlen(cString); itsString = new char[itsLen+1]; for (int 1 = 0; KitsLen; i++)

itsString[i] = cString[i]; itsString[itsLen] = \ 0 ; ASSERTdnvariantsO);

конструктор-копировщик

String.:String (const String & rhs)

itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (int 1=0; i<itsLen;i++) itsString[i] = rhs[i];

itsString[itsLen] = \ 0;

ASSERTdnvariantsO);

деструктор освобождает выделенную память

String:: String ()

ASSERT(Invariants()); delete [] itsString; itsLen = 0;

оператор выполняет сравнение, освобождает занятую память

затем копирует строку и ее размер

Strings String::operator=(const String & rhs)

ASSERT(lnvariants()); if (this == &rhs)

return *this; delete [] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (int i = 0; KitsLen; i++)

itsString[i] = rhs[i]; itsString[itsLen] = \ 0 ; ASSERT(Invariants()); return *this;

неконстантный оператор индексирования char & String::operator[](int offset)

ASSERT(lnvariantsO);



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

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