Выпуск № 1347 от 01.07.2009, 17:05
Администратор рассылки: Dr_Andrew, Модератор
В рассылке: подписчиков - 628, экспертов - 148
В номере: вопросов - 1, ответов - 1
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 169909: Пмогите решить задачку!!! Нужно написать стек таким образом, чтобы генерировать исключения для такого количества условий, какое Вы считаете приемлемым. (Например, невозможность выделить нужное количество памяти, переполнение стека и т.д.) Зара...
Вопрос № 169909:
Пмогите решить задачку!!! Нужно написать стек таким образом, чтобы генерировать исключения для такого количества условий, какое Вы считаете приемлемым. (Например, невозможность выделить нужное количество памяти, переполнение стека и т.д.) Заранее Спасибо!
Программа. Тестировалась в MS VS 2008. Это важный момент. Т.к. далеко не во всех библиотеках class exception имеет конструктор с параметром const char* const.
Базовый класс для обработки исключений стека class stack_exception. Наследуйте от него свои классы исключений, если Вам мало тех, что уже есть.
// Базовый класс для исключений стека class stack_exception:public exception { public: stack_exception(const char* const msg="Исключен
ие при работе со стеком") :exception(msg) {} virtual ~stack_exception(){} };
// Исключение при извлечении из пустого стека class stack_empty_exception:public stack_exception { public: stack_empty_exception(const char* const msg="Попытка извлечения из пустого стека") :stack_exception(msg) {} };
// Исключение при возникновении переполнения стека class stack_overflow_exception:public stack_exception { public: stack_overflow_exception(const
char* const msg="Стек переполнен") :stack_exception(msg) {} };
class stack_iterator_exception:public stack_exception { public: stack_iterator_exception(const char* const msg="Ошибка в итераторе") :stack_exception(msg) {} };
// Класс-стек template<class _Ty> class stack { protected: // Базовый класс для итератора. По заданию итераторы не требуются. Можно опустить. class
base_iterator { public: _Ty& operator*()const { if(_current<_stack._top) { return _stack._data[_current]; } throw stack_iterator_exception("Выход за границу стека"); }
bool operator==(const base_iterator& right) const { if(&_stack==right._stack) { return _current==right._current; } throw stack_iterator_exception("Итераторы служат для обработки разных стеков"); } bool operator!=(const
base_iterator& right) const { if(&_stack==&right._stack) { return _current!=right._current; } throw stack_iterator_exception("Итераторы служат для обработки разных стеков"); } protected: base_iterator(const stack<_Ty>& s,size_t current=0) :_stack(s) ,_current(current) {} const stack<_Ty>& _stack; size_t _current; }; public: // Итератор class iterator:pu
blic base_iterator { public: const iterator& operator++() { if(_current<_stack._top) { ++_current; return *this; } throw stack_iterator_exception("Выход за границу стека"); } const iterator operator++(int) { if(_current<_stack._top) { iterator res(*this); ++_current; return res; } throw stack_iterator_exception("Выход за границу стека"); }; private: iterator(const
stack<_Ty>& s,size_t current=0) :base_iterator(s,current) {} friend class stack; };
// Методы и члены класса stack // Конструктор explicit stack(size_t size=_initSize); stack(const stack& s); // Деструктор virtual ~stack(void); // Оператор присваивания const stack& operator=(const stack& right); // Количество элементов в стеке size_t count(void) const; // Заносит данные в стек void pus
h(_Ty item); // Извлекает элемент из стека _Ty pop(void); // Итератор на начало iterator begin() { return iterato
r(*this,0); } // Итератор на конец iterator end() { return iterator(*this,_top); } private: // Минимальный размер стека по умолчанию static const size_t _initSize=32; // Вершина стека size_t _top; // Размер стека size_t _size; // Данные стека _Ty* _data; // Освобождает ресурсы void _dispose(void); // Копирует данные void _copy(const stack& s); static void _copy(const _Ty* from, _Ty* to, size_t length); friend class iterator; friend
class base_iterator; };
Проверка метода push() В стек s
tack_1 заносятся следующие числа: 0,1,2,3,4,5,6,7,8,9 Проверка итератора Были занесены следующие данные(в порядке попадания в стек): 0,1,2,3,4,5,6,7,8,9 Проверка конструктора копирования stack_2(stack_1): 0,1,2,3,4,5,6,7,8,9 Проверка оператора присваивания stack_3=stack_2: 0,1,2,3,4,5,6,7,8,9 Проверка метода pop() 9,8,7,6,5,4,3,2,1,0
Ответ отправил: Micren, Практикант
Ответ отправлен: 28.06.2009, 05:55
Как сказать этому эксперту "спасибо"?
Отправить SMS
#thank 251571
на номер 1151 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.