|
Программирование >> Дополнительные возможности наследования
Уровни отладко в больших и сложных проектах вам, возможно, понадобится больше рычагов управления для отлаживания профаммы, чем просто подключение и отключение режима отладки (путем определения лексемы 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);
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |